2013-03-05 3 views
1

Существует некоторая проблема с объявлением указателя глобального файла, в результате которого я получаю ошибку сегментации. GDB показал, что это происходит конкретно на линии fscanf в функции sourceToStream. Любая помощь будет оценена по достоинству.Объявление глобального указателя файла в C

#define SOURCE_CODE "source_code.txt"   
#define CHARACTER_STREAM "character_stream.txt" 

static FILE* in_fp; 
static FILE* out_fp; 

void sourceToStream() { 
    char buf; 

    while(fscanf(in_fp, "%c", &buf) != EOF) { 
     if (buf == '\%') 
      while(buf!='\n' && buf !='\r' && buf!=EOF) 
       fscanf(in_fp, "%c", &buf); 

     if(buf != '\n' && buf != '\r' && buf != '\t' && buf != ' ') 
      fprintf(out_fp, "%c", buf); 
    } 
} 

int main() { 

    in_fp = fopen(SOURCE_CODE, "r"); 
    out_fp = fopen(CHARACTER_STREAM, "w"); 

    sourceToStream(); 

    fclose(in_fp); 
    fclose(out_fp); 

    return 0; 
} 
+2

ли FOPEN() '' успеха? – hmjd

+1

Я не знаю, почему Майк удалил свой комментарий, но почему бы вам не проверить возвращаемое значение 'fopen'? – Shahbaz

+0

Есть два 'fscanf'. – md5

ответ

2

GDB дает следующий результат после выполнения первого Еореп()
(GDB) р in_fp $ 1 = (FILE *) 0x0
(GDB) р * in_fp не удается получить доступ к памяти по адресу 0x0

Это значит, что файлы не открываются правильно, или более конкретно, что source_code.txt не был открыт для чтения.

Поскольку вы не указали путь в своей открытой команде, убедитесь, что они находятся в текущем рабочем каталоге (в каталоге, из которого выполняется выполнение вашего двоичного кода), и убедитесь, что у вас есть права на чтение/запись.

Для fopen() вы можете проверить, если полученный дескриптор файла NULL, то выводит сообщение об ошибке, если это было:

in_fp = fopen(SOURCE_CODE, "r"); 
    if(in_fp == NULL) { 
     perror("Failed to open the source"); 
     return EXIT_FAILURE; 
    } 

Если, например, файл не существует, вы получите что-то вроде:

не

не удалось открыть источник: нет такого файла или каталога

+1

Фактически, файл-to-open должен находиться в текущем рабочем каталоге, который * не * обязательно совпадает с каталогом, где сидит код. +1 в противном случае. – bitmask

+0

@bitmask - Хорошо, я сделал предположение, что источник, двоичный код и текст были просто сбрасываются в одном и том же месте, но это точно не обязательно. Обновлено. – Mike

+0

Зачем вам ссылаться на cplusplus.com для функции C? Не говоря уже о том, что cplusplus.com обычно считается полным неточной информации, и его следует избегать в любом случае. – Shahbaz

Смежные вопросы