Подтвердить что ты не робот

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

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

float input;

printf("Input No: ");
scanf("%f", &input);

while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}
4b9b3361

Ответ 1

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

Один способ проверить конец потока - с помощью функции feof.

if (feof(stdin))

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

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

Ответ 2

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

while(!feof(stdin))

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

Ответ 3

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

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

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

Вы знаете, это напоминает мне все причины, которые я ненавижу scanf(), и почему я использую fgets() вместо этого, а затем, возможно, проанализирую его с помощью sscanf().

Ответ 4

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

while(!EOF)

с

while(!feof(stdin))

Ответ 5

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

  • scanf() задыхается от символа, который недопустим для спецификатора преобразования% f (то есть что-то, что не является цифрой, точкой, "e" или "E" );
  • scanf() обнаружил EOF;
  • 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);
    }
 }

Ответ 6

while(scanf("%d %d",a,b)!=EOF)
{

//do .....
}