C 语言中的基本流处理

basic stream handling in c

提问人:Stanislaw T 提问时间:11/25/2013 更新时间:11/28/2013 访问量:110

问:

我只是对 C 中的基本流处理感到困惑。即使经过一个小时的谷歌搜索和阅读这个问题,我也没有更聪明(这不是我第一次尝试深入研究这个问题)。 我正在尝试从输入中读取数字,直到达到 EOF 或非数字,并能够区分这 2 个。据我了解,这应该有效,但条件从来都不是真的。为什么?有人可以为我提供一个工作代码片段以及一个虚拟友好的深入解释吗?feofferror

#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;
}
c stdin feof

评论

1赞 JeffRSon 11/25/2013
Stdin 永无止境 - 它有点暂停。尝试使用文件。(你可能想在谷歌上搜索 stdin/stdout/stderr - 这是特殊的流)。
0赞 WhozCraig 11/25/2013
你如何结束你的输入?而 ferror() 只会在处于错误状态时报告 true;当您输入无效的数据时,则不会。错误由 scanf() 返回,您正在适当地检查该错误。
0赞 David Foerster 11/25/2013
@JeffRSon:当您将 EOF 发送到 tty 时,tty 的 stdin 结束。在许多终端上,Ctrl+D 都会这样做。

答:

0赞 Stanislaw T 11/28/2013 #1

我理解流行为的问题源于一个小特点。我不知道在 Windows 控制台中有一个 newb 不友好的歧义,Ctrl+Z 可以读取 ASCII 0x1A如果您输入像 12 23 ^Z/enter/ 一样,但当您执行 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;

对于误导性的问题,我深表歉意。