概述

我们在使用C标准I/O时,经常会看到EOF这个概念,这里需要明确的是并不存在EOF这样一个字符,它只是一个控制条件。起初,我认为EOF就是字面意思即,到达了文件的结尾(End of File)。可是,最近在看K&R时,发现函数返回时EOF表示的是当前函数调用出现了错误,这些错误包括:

  • 文件达到了末尾;
  • 文件读写出现了错误,比如,磁盘没有空间。

下面是man中,关于fgetc的解释:

fgetc() reads the next character from stream and returns it as an unsigned char cast to an int,
or EOF on end of file or error.

下面是EOF的定义:

#define  EOF (-1)

下面通过一个示例讲解一下EOF的用法。

读取一个字符

fgetc这个函数每次从文件流中读取一个,其函数原型如下:

int fgetc(FILE *stream);

这个函数需要的注意地方有几点:

  1. 每次调用其都返回stream流的下一个字符。
  2. 函数返回类型为unsigned char(强制类型转换为int)正常情况下,是一个大于0的整数
  3. 如果到达文件末尾或发生错误,则返回EOF,通过feof和ferror区分是到达了文件末尾还是发生了错误

下面举一个关于fgetc的例子,其每从标准输入读取一个字符,并输出到标准输出,直到1)到达文件末尾;2)遇到错误。

#include <stdio.h>
int main(void)
{int c;while ((c = fgetc(stdin)) != EOF) {fputc(c, stdout);}if (feof(stdin)) {fprintf(stdout, "end of file.\n");}if (ferror(stdin)) {fprintf(stderr, "some error ocurred.\n");}return 0;
}
lhl@ubuntu20:~/work/BLOGS/C/io$ ./eof
hello
hello
^D         //使用Ctrl+D模拟达到文件末尾
end of file.

Unix I/O EOF?

Unix I/O中的read函数如何表示一个文件到达了文件的末尾了呢?下面是man中关于read返回值的解释:

 #include <unistd.h>ssize_t read(int fd, void *buf, size_t count);On  success, the number of bytes read is returned (zero indicates end of file), and the file position is
advanced by this number.  It is not an error if this number is smaller than the number of bytes requested;this may happen for example because fewer bytes are ac‐tually available right now (maybe because we were
close to end-of-file, or because we are reading from a pipe, or from a terminal), or because read() was
interrupted by a signal.  See also NOTES.On error, -1 is returned, and errno is set appropriately.  In this case, it is left unspecified whether
the file position (if any) changes.

这里有几点需要注意:

  1. read正常情况下,返回读取的字节数量;
  2. **0表示文件到达了末尾,Enf of File,Unix I/O EOF仅仅表示文件到达了末尾
  3. 返回值大于0,但小于count是正常的,表示文件剩余的字数量就是这么多;
  4. -1,表示read执行遇到到了错误,比如,被信号中断等。

网络编程中的EOF

网络编程中也会经常遇到EOF这样一个概念,确切的说EOF是由内核检测到的一种条件。上一节说了,当read返回0时,表明文件到达了末尾,网络编程也是类似的,当应用程序接收到一个由read返回的0值之后,它就会认为遇到了EOF这个条件,从而做出相应的处理。对于TCP连接来说,当一个进程主动关闭连接的一端时,本地read就会发出EOF信号,连接的另一端的进程在试图读取流中最后一个字节之后的字节时,会检测到EOF。

EOF到底是什么意思?相关推荐

  1. Linux 中的 EOF 到底是什么?

    转载自:http://woshijpf.github.io/2016/07/07/Linux%E4%B8%AD%E7%9A%84EOF%E5%88%B0%E5%BA%95%E6%98%AF%E4%BB ...

  2. linux socket eof,Linux 中的 EOF 到底是什么?

    EOF 的定义 EOF 是 end of file 的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(s ...

  3. C语言的EOF是什么?getchar()!=EOF返回的是什么?

    今天打算从新学习下C 结合这个高级语言学习算法等东西 ..第一天. 发现个小问题如标题.是<c语言程序设计(C语言之父)>---网友推荐的书.我看到前面的时候看到这个标题的问题. 测试代码 ...

  4. 文件结束标志EOF及fgetc fgets getc gets getchar函数

    1. EOF(end of file) 大家都知道流(文本流,标准输入流)结束时会返回EOF,那么EOF到底是什么呢? 在stdio.h中我们可以看到相关声明: #define EOF (-1) 很明 ...

  5. C语言实现字母的大写转换成小写

    C语言实现字母的大写转换成小写 1 问题描述: 2 程序代码: 2.1 代码分析: 3 改进 3.1 程序测试结果 参考资料 1 问题描述: 程序功能:实现字母的大小写转换.输入一个大写字母,接着按下 ...

  6. python爬虫读取pdf_python爬虫处理在线预览的pdf文档

    引言 最近在爬一个网站,然后爬到详情页的时候发现,目标内容是用pdf在线预览的 比如如下网站: https://camelot-py.readthedocs.io/en/master/_static/ ...

  7. 文件IO编程之学习总结

    目录 一.多文件编程 二.⽬录(⽂件)操作 1.创建⽬录mkdir 2.删除⽬录rmdir 3.打开⽬录⽂件 4.获取打开⽬录中的⽂件readdir 5.关闭打开的⽬录⽂件closedir 6.字符串 ...

  8. C++程序设计——十二

    目录 C++ 命名空间:流和文件I/O 命名空间 定义命名空间 using指令 不连续的命名空间 嵌套的命名空间 流和文件I/O 流的概念 C++的标准IO流 C++的文件IO流 C++ 命名空间:流 ...

  9. Linux应用层开发(文件、多线程,多进程、进程间通信)

    文件IO编程        linux下⼀切皆⽂件,我们操作外设(⿏标.键盘.磁盘等外设)就像操作⽂件⼀样.要如何操作⽂件与外设,就必须熟练掌握⽂件IO(input写.output读) 1.多文件编程 ...

  10. 记面试外包公司的一次经历,到底该不该去?

    在it这个行业中,相信很多人经常不可避免的听到一个词'外包',尤其是对于找工作的朋友们,更是一种艰难的选择,为什么这么说呢? 因为对于一些从培训班出来的新人进入互联网行业,有时候进外包公司是真的被逼的 ...

最新文章

  1. Socket详解——全面明了
  2. RPC调用框架比较分析
  3. rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)
  4. 随想录(ccpp之间的相互调用)
  5. Spring Framework 核心原理与源码解析-大纲
  6. 作业5.2 5.3
  7. Eclipse alt+/语法不提示的解决方法
  8. linux扩容系统盘分区,系统盘扩容 扩展分区与文件系统_Linux系统盘
  9. 20阶乘matlab,matlab如何调用阶乘函数求阶乘的和
  10. 在线教育:最常见的直播课程有哪些?
  11. 四足机器人动力学建模(一)
  12. 网课脚本教程 【基础】(2) 脚本制作规范
  13. 主板检测卡c5_计算机主板检测卡检测显示C5是哪的問題?
  14. No buffer space available 和windows 2003复制文件时:配额不足,无法处理该命令
  15. 计算机基础知识学习总结
  16. 电瓶车充电桩收费平台解决小区充电难的问题
  17. 化妆品行业如何开启新零售模式?你懂了吗
  18. win10蓝屏0xc000021a怎么修复?
  19. 计算机课程收获ppt模板,大学计算机实验心得收获.ppt
  20. 维恩贝特面试java后端开发面试经验

热门文章

  1. SpringBoot 启动时自动执行代码的几种方式
  2. 三维重建(知识点详细解读、主要流程)
  3. 如何绘制深度神经网络图
  4. PostgreSQL视图和物化视图
  5. 业界 | 数据科学家要先学逻辑回归?图样图森破!
  6. 蓝桥杯每日一练----字符串逆序
  7. bugzilla dbd-mysql_Redhat 搭建bugzilla平台
  8. Fedora20在神州战神K650D1安装过程,使用netinstall和Dvd.iso镜像安装。
  9. 计算机类毕业设计评语导师评语,毕业设计导师评语
  10. TreeMap根据value排序遇到的问题及分析