C++ scanf 函数与EOF 浅析

原创 2015年07月07日 22:22:38
【摘要】

常常遇到这段代码, while(scanf("%d",&num)!=EOF){...} ,对于 EOF 以及 scanf 函数的返回值始终没有好好研究过,本文将对这个问题进行一下简单的剖析。


【正文】


【scanf 函数返回值】
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
3.当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1;

4.如果在scanf的时候在终端输入ctrl+d,或者直接输入异常时,scanf的返回值将是-1。


【EOF是什么】
EOF是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统就认为文件结束了。但是,后来我发现,EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

#define EOF (-1)


在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。
所以,处理文件可以写成下面这样:
  int c;
  while ((c = fgetc(fp)) != EOF)
      {
    do something
  }
但是,这样写也有问题。fgetc()读取文件的最后一个字符以后,C语言的feof()函数依然返回0,表明没有到达文件结尾;只有当fgetc()向后再读取一个字符(即越过最后一个字符),feof()才会返回一个非零值,表示到达文件结尾。

所以,按照上面这样写法,如果一个文件含有n个字符,那么while循环的内部操作会运行n+1次。所以,最保险的写法是像下面这样:

  int c = fgetc(fp);
  while (c != EOF) 
      {
    do something;

    c = fgetc(fp);
  }
  if (feof(fp)) {
    printf("\n End of file reached.");
  } else {
    printf("\n Something went wrong.");
  }
除了表示文件结尾,EOF还可以表示标准输入的结尾。
  int c;
  while ((c = getchar()) != EOF) 
      {
    putchar(c);
  }
但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。
Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)
那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl-V,连续输入两次就行了。
版权声明: 举报

相关文章推荐

C中scanf()!=EOF的理解

我们来个例子说明吧: 遇到这个表达式:scanf("%d%d",&a,&b)!=EOF; 如果a和b都被成功读入,那么上面表达式的结果为2; 如果只有一个读入,那么上面表达式的结果为1; 如果...
  • yeruby
  • yeruby
  • 2012-04-23 13:10
  • 10342

getchar()和scanf("%c",ch)在用EOF判断结束时的区别

1、getchar() #include int main() { int c; while((c = getchar()) != EOF) putchar...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

EOF的含义与scanf的返回值

我学习C语言的时候,遇到的一个问题就是EOF。 它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。 ...

C++ scanf 函数与EOF 浅析

常常遇到这段代码, while(scanf("%d",&num)!=EOF){...} ,对于 EOF 以及 scanf 函数的返回值始终没有好好研究过,本文将对这个问题进行一下简单的剖析。

scanf函数浅析

对于该函数,我觉得需要紧记的是: 1)        在输入流中,字符只能由空白字符(包括空格、换行符、制表符)分割,不能由分号、逗号分割。 2)    控制串中的空白符使 s...
  • num24
  • num24
  • 2014-07-25 22:41
  • 318

C的scanf函数+EOF+C扩展的fflush函数

scanf,getchar,putchar,fflush,EOF,空白符,分隔符,stdin,键盘缓冲区,scanf(“ %c ”),scanf(“ %s”)

浅谈scanf()函数

浅谈scanf()函数

scanf()函数剖析

scanf函数我曾经在 这个函数上犯过不少错误,也看到别人犯过的错误,记下来,提醒自己不要重蹈覆辙了。如果对你有用,那就更好了:)如果你发现文章中有错误,欢迎你不吝赐 教。希望和大家一起学习!(我的邮...

while函数输入小结

1.知识点1: scanf函数的返回值可以简单理解为为输入变量的个数: Both scanf and wscanf return the number of fields successfully c...

while(scanf("%d",&n)!=EOF)

关于C++如何判断结束输入的方法while(scanf("%d",&n)!=EOF)
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)