c语言中的基本流处理

c语言中的基本流处理,c,stdin,feof,C,Stdin,Feof,我只是对C语言中的基本流处理感到困惑。即使在谷歌搜索和阅读了一个小时之后,我也没有变得更聪明(这不是我第一次尝试深入研究这个问题)。 我试图从输入中读取数字,直到达到EOF或非数字,并能够区分这两个数字。据我所知,这应该是可行的,但是feof和ferror条件永远都不成立。为什么呢?有人能给我提供一个工作代码片段和一个虚拟友好的深入解释吗 #include <stdio.h> #include <stdlib.h> int main() { int number;

我只是对C语言中的基本流处理感到困惑。即使在谷歌搜索和阅读了一个小时之后,我也没有变得更聪明(这不是我第一次尝试深入研究这个问题)。 我试图从输入中读取数字,直到达到EOF或非数字,并能够区分这两个数字。据我所知,这应该是可行的,但是
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;
}
#包括
#包括
int main()
{
整数;
printf(“编号或EOF:\n”);
while(scanf(“%d”,&number)==1)
{
printf(“读取编号%d\n”,编号);
}
如果(ferror(stdin))printf(“错误读取\n”);
否则如果(feof(stdin))printf(“达到eof\n”);
返回0;
}

我在理解流行为时遇到的问题源于一个小小的特性。我不知道在Windows控制台中有一个新的不友好的歧义,如果您输入12 23^Z/enter/之类的输入,Ctrl+Z可以读作ASCII 0x1A,但当您执行12 23/enter/^Z/enter/时,会读作正确的EOF。 这段代码解决了这个问题

#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;
#包括
#包括
int main()
{
printf(“int或eof\n”);
int-num;
while(scanf(“%d”,&num)==1)
{
printf(“读取的数字是%d\n”,num);
}
如果(!feof(stdin)&&getchar()!=0x1A)//首先检查其是否读取为EOF,
//如果失败,请调用getchar以获取帮助以检查^Z
{
printf(“非整数错误\n”);
}
else printf(“eof ok\n”);
系统(“暂停”);
返回0;

很抱歉我提出了一个误导性的问题。

stdin永远不会结束-它有点暂停了。请用一个文件试试。(你可能想用谷歌搜索一下stdin/stdout/stderr-它们是特殊的流)。您如何结束输入?只有当流处于错误状态时才会报告true;而当您输入无效数据时不会报告true。该错误由返回,您正在适当地检查该错误。@Jefferson:tty中的stdin在您将EOF发送到tty时结束。在许多终端上,Ctrl+D将完成此操作。