Дополнительный цикл с EOF

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

while(!feof(archlog))
{  if(!fgets(line,MAXLINE,archlog))
     printf("\nERROR: Can't read on: %s\n", ARCHTXT);
   else
     printf("%s",line);
}

Когда я запускаю это, он печатает текст файла, но делает дополнительный цикл и печатает ОШИБКУ, я хочу избежать этого, я хочу, чтобы он печатал только текст файла без дополнительного цикла.


person Paul Edward Castro Nava    schedule 12.03.2013    source источник
comment
Вы можете найти ответ здесь: stackoverflow.com /вопросы/5431941/   -  person GodMan    schedule 12.03.2013


Ответы (4)


Я всегда обращаю два вызова функций:

while(fgets(line,MAXLINE,archlog))
{  if(feof(archlog))
     break;
   else
     printf("%s",line);
}

Это выводит меня, когда читается конец файла. Иногда я использую "или" в ferror(archlog) для вызова feof(), чтобы выйти из строя при ошибке или EOF.

person Steve Valliere    schedule 12.03.2013

Цикл повторится, если файл заканчивается новой строкой.

Обходной путь должен быть:

while(!feof(archlog))
{  if(!fgets(line,MAXLINE,archlog))
     printf("\nERROR: Can't read on: %s\n", ARCHTXT);
   else
     printf("%s",line);

   if ( (c=fgetc(archlog)) == EOF)
      break;
   ungetc(c, archlog);
}
person Felipe Lavratti    schedule 12.03.2013

Флаг EOF устанавливается, когда ваша функция gets считывает EOF. Это означает, что последняя итерация всегда будет вызывать сообщение об ошибке. После этого цикл снова проверяет флаг EOF, который был активирован при последнем чтении, и, таким образом, выходит из цикла.

Вы можете обойти это, поместив тест EOF внутрь цикла. Там вы можете либо напечатать текст при успешном чтении, либо установить логическое значение для выхода из цикла в случае сбоя.

person deau    schedule 12.03.2013

Вы не должны использовать feof(FILE *f) в своих циклах, так как он возвращает true, только если EOF прочитано, но не достигнуто, см. Как использовать feof(ФАЙЛ *f)?

Вместо этого используйте fgets и его код возврата для условия:

while(fgets(line, MAXLINE, archlog) != NULL) {
    printf("%s", line);
}

Нет необходимости проверять feof(archlog) внутри цикла. Для проверки ошибок используйте ferror(archlog).

person harpun    schedule 12.03.2013