Базовая обработка потока в c

Я просто сбит с толку основной обработкой потока в C. Даже после часа поиска в Google и чтения по этой проблеме, я не мудрый (и это не первая моя попытка вникнуть в это). Я пытаюсь читать цифры из ввода до тех пор, пока не будет достигнут EOF или не число, и смогу различить эти 2. От того, что я понимаю, это должно работать, но feof а также ferror условия никогда не выполняются. Это почему? И может ли кто-нибудь предоставить мне рабочий фрагмент кода вместе с дурацким дружеским подробным объяснением?

#include <stdio.h>
#include <stdlib.h>

int main()
{
  int number;
  printf("number or EOF:\n");

  while(scanf("%d",&number) == 1)
  {
          printf("read number %d\n",number);
  }
  if(ferror(stdin))printf("error reading\n");
  else if (feof(stdin))printf("eof reached\n");
  return 0;
}

1 ответ

Решение

Моя проблема с пониманием поведения потока у меня возникла из-за одной маленькой особенности. Я не знал, что в консоли Windows есть новая недружественная неопределенность, Ctrl+Z может быть как чтение ASCII 0x1A, если вы вводите ввод как 12 23 ^Z/enter/, но читается как правильный EOF, когда вы делаете 12 23 /enter/^Z/ введите /. этот код решает проблему

#include <stdio.h>
#include <stdlib.h>

int main()
{


 printf("int or eof\n");
    int num;
    while( scanf("%d",&num) ==1 )
    {
        printf("the read number is  %d \n",num);
    }
    if(!feof(stdin) && getchar()!=0x1A)//first check if its read as EOF,
          //if it fails, call getchar for help to check for ^Z
    {
        printf("non-int error\n");
    }
    else printf("eof ok\n");
    system("PAUSE");
    return 0;

Я прошу прощения за вводящий в заблуждение вопрос.

Другие вопросы по тегам