【问题标题】:basic stream handling in cc中的基本流处理
【发布时间】:2013-11-24 20:34:45
【问题描述】:

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

#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;
}

【问题讨论】:

  • stdin 永远不会结束 - 它有点暂停。用文件试试。 (您可能想在谷歌上搜索 stdin/stdout/stderr - 它们是特殊的流)。
  • 你如何结束你的输入?而ferror() 只会在 处于错误状态时报告 true;不是当您输入无效的数据时。 那个错误由scanf()返回,你正在适当地检查。
  • @JeffRSon:当您将 EOF 发送到 tty 时,来自 tty 的标准输入结束。在许多终端上 Ctrl+D 会这样做。

标签: c stdin feof


【解决方案1】:

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

#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;

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 2017-03-12
    • 2012-07-27
    • 1970-01-01
    • 2022-11-10
    • 2017-04-29
    • 2018-08-28
    • 2011-11-15
    相关资源
    最近更新 更多