2013-05-19 4 views
0

Я задал другой вопрос об этом ранее, но я был вне базы относительно проблемы, поэтому я создал новый вопрос, поскольку задаю совершенно другой вопрос.feof обнаружение ложного конца файла

У меня есть функция, которая читает данную строку в текстовом файле (задается переменной переменного тока). Он выполняет чтение строки, а затем проверяет, была ли последняя строка в файле. Если это так, он увеличивает значение.

Проблема в том, что она увеличивала значение, даже если это не фактический конец файла. Я думаю, что я использую feof неправильно, но у меня не было никакой удачи заставить его работать:

int readIn(TinCan* inCan, int toggle) 
    { 
    int ii, isFinished = 0; 
    char fullName[20]; 
    sprintf(fullName, "Label_%d.txt", inCan->pid); 

    FILE* fp; 
    fp = fopen(fullName, "r"); 

    if(fp==NULL) 
     { 
     printf("Error: could not open %s\n", fullName); 
     } 

    else 
     { 
     for (ii=0; ii < ((inCan->ac)-1); ii++) 
     { 
     fscanf(fp, "%*d %*d %*d\n"); /*move through lines without scanning*/ 
     } 
     fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time); 
     } 

    if (feof(fp) && (toggle == 1)) 
     { 
     printf("File ended"); 
     writeLog(inCan); 
     isFinished = 1; 
     terminated++; 
     } 

    fclose(fp); 
    return finished; 
    } 

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

1 1 30 
2 2 5 
3 1 1 

fscanf правильно присваивает значения. Во второй строке feof возвращает true и завершается, увеличивается. feof возвращает true снова для третьей строки, а приращения завершаются второй раз.

+2

возвращение закончена, isFinished я думаю –

+0

Все, что я сказал на другой вопрос, по-прежнему имеет место. Просьба представить данные файла образца, то, что вы получаете как вывод, то, что вы ожидаете получить как результат, и возвращаемые значения от fscanf – xaxxon

+1

О, странно. Да, что сказал @marabutt - если это скомпилировано, чем закончилось, это глобальная переменная где-то, и это очень не то, что вы думаете, что возвращаетесь. Или вы опечатываете его при копировании в stackoverflow. – xaxxon

ответ

1

feof() не определяет, закончился ли файл. Он обнаруживает, что последняя ошибка чтения была связана с завершением файла.

feof() только после неудачного считывания.

Итак, сначала прочитайте данные и проверьте возвращаемое значение. Если чтение не удалось, используйте feof(), чтобы убедиться, что он не сработал, потому что был достигнут КОНЕЦ-ФАЙЛ (другие причины отказа чтения - некоторая ошибка (сеть вниз, плохой сектор, принтер в состоянии пожара, ...), обнаруживаемый с ferror()).

+0

Как проверить возвращаемое значение? Сравните его с NULL? – Dawson

+0

@Dawson, распечатав коды возврата fscanf, как я просил вас в течение последних 30 минут: -P – xaxxon

+1

'fscanf()' возвращает количество выполняемых присваиваний или 'EOF' в случае раннего END-OF- ФАЙЛ или ошибка. Используйте это возвращаемое значение: 'if (fscanf (...)!= )/* что-то странное * /; ' – pmg

1

Трудно сказать, не зная, формат данных, но

fscanf(fp,"%d %d %d", &inCan->ac, &inCan->state, &inCan->time); 

прочтет 3 значения, но на последней строке, он не будет читать символ конца строки, так что это не конец файла.

Try:

fscanf(fp,"%d %d %d\n", &inCan->ac, &inCan->state, &inCan->time); 

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

  • Нет связанных вопросов^_^