2014-12-16 3 views
0

Это кажется очень простым, но я не могу понять это, не трогая программирование C за четыре года.C segmention fault при открытии файла

Я пытался открыть файл в главном()

int main(int argc, const char * argv[]) 
{ 
    FILE * fp = fopen("data.txt","r"); 
    ... 
    return(0) 
} 

Программа компилируется, но когда я попытался запустить его в БГД, возникает следующая ошибка.

Program received signal SIGSEGV, Segmentation fault. 
0x00000000004016c6 in main() 

Когда программа пытается открыть файл «data.txt». Что может вызвать ошибку? Благодаря!

+5

Я предполагаю, что segfault не исходит из этой линии. Компилируйте с информацией отладки и выясните, где она на самом деле происходит, и дайте нам остальную часть кода. –

+1

Выполняете нулевую проверку указателя файла после открытия файла. fopen возвращает null, если файл не существует, когда вы пытаетесь открыть его в режиме чтения. Не могли бы вы поместить остальную часть кода, чтобы мы могли помочь вам с этим –

ответ

2

Я подозреваю, что ваша ошибка заключается в этот бит кода:

... 

Другими словами, нет ничего в другом коде показано, что, как представляется, не так.

Самый Вероятно, Дело в том, что файл не существует или он не существует в каталоге, в котором работает программа (которая, если вы в среде IDE, обычно оказывается где-то прочее, чем вы думаете, это так).

И в этом случае вы получаете NULL из fopen, потом используя его, что-то вроде:

FILE *fp = fopen ("no_such_file.txt", "r"); 
int ch = fgetc (fp); 

Вы должны обычно проверки возвращаемых значений из всех функций, которые используют их для указания успеха или неудачи:

#include <stdio.h> 

int main (void) { 
    FILE *fp = fopen ("no_such_file.txt", "r"); 
    if (fp == NULL) { 
     perror ("Opening no_such_file.txt"); 
     return 1; 
    } 

    // You can use fp here. 

    puts ("It worked."); 
    fclose (fp); 

    return 0; 
} 
+0

'char * path = ...; fp = open (путь, "r"); if (fp == NULL) {perror (path); ...} ' –

1

Что может стать причиной ошибки?

Наиболее вероятной причиной ошибки является то, что файл data.txt не может быть открыт (например, потому что он не существует или его нет в текущей директории, или ваша программа не имеет разрешения на прочитайте его). Это приведет к тому, что fopen() вернет NULL. Затем, если ваш код (в разделе ...) пытается вызвать fread() или fgets() или что-то еще и передает указатель NULL, это приведет к сбою. Вам нужно проверить значение, возвращаемое функцией fopen(), чтобы убедиться, что он не равен NULL, прежде чем пытаться его использовать.