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
  • 12138

EOF的含义与scanf的返回值

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

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

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

while(scanf()!=EOF)的情况

EOF在scanf连用时代表-1的意思,当用到while(scanf()!=EOF),代表的意思是一直输入,直到scanf返回的值是-1时才会停止输入,也可以在while里面加上一些约束条件,使输入在...

C/C++ ifstream之eof()

用ifstream的eof(),竟然读到文件最后了,判断eof还为false。网上查找资料后,终于解决这个问题。参照文件:http://tuhao.blogbus.com/logs/21306687....

C/C++ EOF文件结束标记总结

getchar()和EOF总结 大师级经典的著作,要字斟句酌的去读,去理解。以前在看K&R的The C Programming Language(SecondEdition) 第1.5节的字符...

C++文件操作之eof函数问题

关于eof函数       fstream / ifstream / ofstream 类中的 成员函数eof()用来检测是否到达文件尾,如果到达文件尾返回非0值,否则返回0。原型是int ...
  • pear_zi
  • pear_zi
  • 2011年10月29日 17:37
  • 4843

scanf()函数的用法和实践

scanf()函数的用法和实践 daizh 摘要: 本文阐述了基于ANSI,Win 95,Win NT上的 C/C++语言中scanf()函数的用法,以及在实际使用中常见错误及对策。...

关于eof和scanf返回值

EOF不是一个字符或者数字什么的,而是scanf()函数的一个返回值。 所以scanf("%c",&c);再判断(c==EOF)的做法是无效的,因为scanf()根本不会把EOF当作一个字符写进c;...

C++之EOF()

    fstream流的eof()判断有点不合常理    按常理逻辑来说,如果到了文件末尾的话,eof()应该返回真,但是,C++输入输出流如何知道是否到末尾了呢?    原来根据的是:如果fin>...
  • ixidof
  • ixidof
  • 2009年11月07日 13:52
  • 17864
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++ scanf 函数与EOF 浅析
举报原因:
原因补充:

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