我学习C语言的时候,遇到的一个问题就是EOF。

它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。

比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。

int c;

while ((c = fgetc(fp)) != EOF) {

putchar (c);

}

很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统就认为文件结束了。

但是,后来我发现,EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

#define EOF (-1)

于是,我就困惑了。

如果EOF是一个特殊字符,那么假定每个文本文件的结尾都有一个EOF(也就是-1),还是可以做到的,因为文本对应的ASCII码都是正值,不可能有负值。但是,二进制文件怎么办呢?怎么处理文件内部包含的-1呢?

这个问题让我想了很久,后来查了资料才知道,在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。

所以,处理文件可以写成下面这样:

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,连续输入两次就行了。

(完)

python eof是什么_EOF是什么?相关推荐

  1. python eof是什么_python eoferror是什么异常

    展开全部 出现"EOFError Python",就意味着发现了e68a8462616964757a686964616f31333365646235一个不期望的文件尾,而这个文件尾 ...

  2. 自行编译Vim for Windows,加入Python支持!

    2019独角兽企业重金招聘Python工程师标准>>> 1.下载Python http://python.org/getit/ Py3K开始流行了,最好Py27和Py32都安装上 2 ...

  3. 【Python】Python3.7.3 - Python命令行参数详解

    文章目录 Python命令行参数概览 -c cmd参数示例 -m mod参数示例 file参数示例 - 参数示例 命令行选项详解 -b 选项 -B选项 -d选项 -E选项 -h / -? / --he ...

  4. 【Python之旅】第四篇(二):Python异常处理与异常捕捉

    在Python程序的执行过程中,难免会出现异常的情况,如果做的是跟用户交互的程序,当用户输入不可接受的内容时,在可预见的范围内,我们当然是希望可以给用户一些提示,而不是原来Python内置异常中的那些 ...

  5. python运行脚本被杀死_从python异常中杀死Bash脚本

    我有一个在其中调用Python的shell脚本. #! /bin/bash shopt -s extglob echo"====test====" ~/.conda/envs/my ...

  6. 编辑python用什么输入法_如何在python中更改iBus输入法?

    我正在编写一个Vim插件来设置iBus引擎和输入方法.到目前为止,我可以用以下代码更换发动机:function! im#setEngine(name) python << EOF try: ...

  7. Python 服务器监控

    Python 服务器监控 一.安装 paramiko 和 psutil 二.实现远程监控 三.问题 CryptographyDeprecationWarning 一.安装 paramiko 和 psu ...

  8. gvim中进行verilog语言信号追踪、显示拓扑插件

    2019独角兽企业重金招聘Python工程师标准>>> 插件使用方法及功能: vtags 是一款在gvim下实现类似verdi的信号追踪.显示拓扑等功能的插件.vtags插件完全使用 ...

  9. Gvim开发环境配置笔记--Windows篇

    环境:Windows7 旗舰版 1.安装Gvim7.3 : 下载地址http://www.vim.org/download.php#pc. 2.安装中文帮助:vimcdoc-1.8.0-setup.e ...

  10. 基于Microsoft Translator API的vim翻译插件

    前些日子需要阅读某个使用日文注释的项目的代码,就想给vim装个翻译插件.网上简单找了下都是基于Google Translator API的,而Google的该服务已经可耻地不免费了. 本着" ...

最新文章

  1. grafana3.1.0安装配置
  2. glib中的GList ,GSList,GString,GTree,GTimer
  3. 北京招聘 | 澜舟科技招聘NLP工程师、NLP研究员、产品项目经理
  4. Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  5. .NET使用免费开源类库操作Excel
  6. 协议簇:TCP 解析:TCP 数据传输
  7. hive币涨幅空间大吗_自动消防水炮只能安装在大空间场所吗
  8. Java容器-面试题
  9. 苹果:确认开始在印度生产iPhone 13
  10. c语言编程中如何对其,C语言内存对齐详解(3)
  11. freeswitch 电话会议
  12. Ubuntu系统重装 -- 制作启动盘、装机过程问题、环境配置
  13. java模拟器1.4.2_j2me模拟器下载
  14. java 调用net remoting_获取 org.springframework.remoting.RemoteAccessException: 在进行调用时无法访问远程服务?...
  15. Python实现PD文字识别、提取并写入CSV文件脚本分享
  16. 常识——server-u显示无法访问网页
  17. 戴尔笔记本,快捷键无法调节屏幕亮度,有图标显示,就是没有调节效果
  18. 比特交织 matlab,比特交织空时编码不对称调制方案及软件分析
  19. 计算机组装涉及哪些硬件,12级计算机组装和维修期中考试题
  20. C语言编写简易图书管理系统

热门文章

  1. 机器学习 | 实战(一)Decision_tree_红酒数据集
  2. 开博尔android播放器,高端安卓播放器的选择——开博尔Q10Plus 二代 4K高清播放器...
  3. 《前端》阿里字体库iconfont使用方法
  4. Jmeter 接口造数
  5. c++实现植物大战僵尸修改器
  6. 植物大战僵尸的简单修改
  7. 036.crud准备
  8. 常用单片机和开发板的引脚功能图
  9. jsp中input 隐藏的方法
  10. html中如何使用input表单隐藏域?