Qubc
@Qubc
Ненавижу полисемию.

Как работает while ( !feof ( cfPtr ) )?

FILE * cfPtr = fopen( "test.txt", "rb" );
		char temp;
		while ( !feof ( cfPtr ) ){
			fread( &temp, sizeof( char ), 1, cfPtr );
			printf("%c\n", temp);
		}

A
B
C
C

Содержимое test.txt есть 414243.
Конечно, можно вызвать fread перед входом в цикл, но понимания это не дает.
  • Вопрос задан
  • 457 просмотров
Решения вопроса 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как работает while ( !feof ( cfPtr ) )?

Как видишь, плохо работает. Потому что man feof говорит нам, что функция возвращает статус потока, а статус потока меняется только от вызова других функций.
Поэтому по всем правилам было бы написать так:
FILE * cfPtr = fopen( "test.txt", "rb" );
char temp;

for (;;) {
  int read = fread( &temp, sizeof( char ), 1, cfPtr );
  if (read == 1) {
    printf("%c\n", temp);
  } else {
    if (feof(cfPtr)) {
      /*случился конец файла*/
    } else if (ferror(cfPtr)) {
      /* случилась ошибка */
    }
    break;
  }
}
Ответ написан
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Фигово работает. Я помню этот кондовый пример с while(!feof()) - и помню, что он у меня как раз и не заработал. Что привело меня к быстрому-быстрому изучению прямого чтения-записи (open/read/close).
Если же нужно работать именно потоковыми функциями - fgets() и прочие возвращают EOF в качестве признака конца файла.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы