关于C语言的EOF
来源:互联网 发布:回族 性风俗 知乎 编辑:程序博客网 时间:2024/04/29 20:47
EOF,它是end of file的缩写,表示”文字流”(stream)的结尾。这里的”文字流”,可以是文件(file),也可以是标准输入(stdin)。
比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。
int c;while ((c = fgetc(fp)) != EOF) { putchar (c);}
EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。
#define EOF (-1)
当系统读取到文件结尾,所返回的一个信号值(也就是-1)。至于系统怎么知道文件的结尾,计算机操作系统需要某种方式来断定每个文件起始和结束的位置。检测文件结尾的一种方法是在文件中放置一个特殊字符来标志结尾。还有一种方法则是让操作系统存储文件大小的信息。对于两种不同方法,C则是让输入函数在到达文件结尾时返回一个特殊值EOF。
所以,处理文件可以写成下面这样:
int c;while ((c = fgetc(fp)) != EOF) { do something}
这样写有一个问题。fgetc()不仅是遇到文件结尾时返回EOF,而且当发生错误时,也会返回EOF。因此,C语言又提供了feof()函数,用来保证确实是到了文件结尾。上面的代码feof()版本的写法就是:
int c;while (!feof(fp)){ c = fgetc(fp); 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语言的EOF
- 关于c/c++语言的EOF
- C语言的EOF
- 关于C语言中的EOF
- 关于c语言中EOF用法的理解
- C语言EOF的用法
- C语言中EOF的应用
- C语言中EOF的应用
- C语言中EOF的应用
- C语言中EOF的意思
- C语言对EOF含义的理解
- c语言中!=EOF的意义
- C语言中的EOF的浅识
- C语言字符输入的EOF
- C语言中EOF的应用
- C语言:关注EOF
- C语言:关注EOF
- C语言中的EOF
- 什么是MVC
- Java中intern()方法的作用
- poj 1127 计算几何入门题 求线段交点
- Java常见异常说明汇总
- react-native学习
- 关于C语言的EOF
- 怎样去学好java
- Sphinx中文分词Coreseek+Mmseg安装配置和示例
- opencv多通道图像转单通道
- 应用程序名称的国际化
- 浅谈CMS垃圾收集器与G1收集器
- JAVA线程的深入理解
- csu 1326 The contest
- hdoj 5497 Inversion 【树状数组维护 区间逆序对】