Обнаружение EOF в C

Мне не нравятся предупреждения. Я удаляю их как можно больше.
Иногда, когда под давлением для окончания задания я оставляю некоторых из них. Я редко оставляю их все же. Я чувствую себя подобно Вам, грязный, если существует кто-либо оставленный.

25
задан Jens 12 June 2013 в 15:24
поделиться

5 ответов

EOF - это просто макрос со значением (обычно -1). Вы должны что-то протестировать против EOF , например, результат вызова getchar () .

Один из способов проверить конец потока - использовать feof .

if (feof(stdin))

Обратите внимание, что состояние «конец потока» будет установлено только после неудачного чтения.

В вашем примере вам, вероятно, следует проверить возвращаемое значение scanf и Если это означает, что поля не были прочитаны, проверьте наличие конца файла.

42
ответ дан 28 November 2019 в 20:45
поделиться

Другая проблема заключается в том, что вы читаете с помощью scanf ("% f", & input); только . Если пользователь вводит что-то, что не может быть интерпретировано как число с плавающей запятой C, например «пи», вызов scanf () не будет назначать ничего для input и выиграет Прогресс оттуда. Это означает, что он будет пытаться продолжать читать «пи», и не удается.

Учитывая изменение в while (! feof (stdin)) , которое правильно рекомендуют другие плакаты, если вы наберете «пи», возникнет бесконечный цикл печати прежнего значения of input и выводит приглашение, но программа никогда не обработает новый ввод.

scanf () возвращает количество сделанных ею присваиваний входным переменным. Если присваивание не было выполнено, это означает, что он не нашел числа с плавающей запятой, и вам следует прочитать дополнительные данные, например, char string [100]; scanf ("% 99s", string); . Это приведет к удалению следующей строки из входного потока (до 99 символов, в любом случае - дополнительный char предназначен для нулевого терминатора в строке).

Вы знаете,

4
ответ дан 28 November 2019 в 20:45
поделиться

в качестве отправной точки вы можете попробовать заменить

while(!EOF)

на

while(!feof(stdin))
-1
ответ дан 28 November 2019 в 20:45
поделиться

EOF - это константа в C. Вы не проверяете фактический файл на наличие EOF. Вам нужно сделать что-то вроде этого

while(!feof(stdin))

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

9
ответ дан 28 November 2019 в 20:45
поделиться

Вы хотите проверить результат scanf (), чтобы убедиться, что преобразование было успешным; если его не было, то верно одно из трех:

  1. scanf () захлебывается символом, который недопустим для спецификатора преобразования% f (то есть чем-то, что не является цифрой, точкой, ' e 'или' E ');
  2. scanf () обнаружил EOF;
  3. scanf () обнаружил ошибку при чтении stdin.

Пример:

int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
 * Loop while moreData is true
 */
while (moreData)
{
  errno = 0;
  int itemsRead = scanf("%f", &input);
  if (itemsRead == 1)
  {
    printf("Output: %f\n", input);
    printf("Input no: ");
    fflush(stdout);
  }
  else
  {
    if (feof(stdin))
    {
      printf("Hit EOF on stdin; exiting\n");
      moreData = 0;
    }
    else if (ferror(stdin))
    {
      /**
       * I *think* scanf() sets errno; if not, replace
       * the line below with a regular printf() and
       * a generic "read error" message.
       */
      perror("error during read");
      moreData = 0;
    }
    else
    {
      printf("Bad character stuck in input stream; clearing to end of line\n");
      while (getchar() != '\n')
        ; /* empty loop */
      printf("Input no: ");
      fflush(stdout);
    }
 }
-1
ответ дан 28 November 2019 в 20:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: