Как определить внутри "while (fscanf! = EOF) {blah}", будет ли следующий fscanf возвращать EOF? - PullRequest
0 голосов
/ 30 апреля 2010

У меня есть код, выполняющийся в цикле while (fscanf! = EOF). Однако, даже когда fscanf завершил выполнение, мне нужно продолжать выполнять этот код, пока не будут выполнены некоторые условия. Я имею в виду, что я мог бы скопировать / вставить код вне цикла while (fscanf) и использовать только глобальные переменные, но это кажется грязным. Наверняка кто-то уже сталкивался с чем-то подобным и нашел более чистое решение.

Ответы [ 4 ]

5 голосов
/ 30 апреля 2010

Не могли бы вы просто изменить условие while для учета этих дополнительных условий?

while(fscanf(...) != EOF || !(some_other_conditions_met)) 
1 голос
/ 30 апреля 2010

Чистые растворы избегают использования scanf / fscanf. Гораздо менее подвержено ошибкам читать всю строку за раз и вместо этого анализировать строку с sscanf.

Из comp.lang.c FAQ: Почему все говорят, что не следует использовать scanf? Что я должен использовать вместо этого?

Запись о feof использование также имеет значение.

1 голос
/ 30 апреля 2010

Ответ на заголовок вашего вопроса в том, что это почти невозможно. Представьте, что вы получаете случайное число и решаете, какую из двух строк формата вы собираетесь передать в fscanf. Вам нужен предварительный прогноз, получит ли fscanf значение eof, даже если вы даже не знаете, каким будет случайное число?

Ответ на основную часть вашего вопроса более или менее соответствует тому, что написал Андреас Бринк. У меня такое чувство, что вам может понадобиться что-то более похожее на это:

for (;;)
{
  // .....
  eofReached = (fscanf(..) == EOF);
  // .....
  if (eofReached && otherConditionsMet) break;
  // .....
}
1 голос
/ 30 апреля 2010

Вы не можете - функция feof () проверяет только состояние конца файла после a операции чтения - нет способа проверить, не сработает ли следующая операция. Вам нужно изменить логику вашей программы, так как ввод / вывод C-потока напрямую не поддерживает то, что вы просите.

...