EOF到底是什么意思?

简介: 我们在使用C标准I/O时,经常会看到EOF这个概念,这里需要明确的是并不存在EOF这样一个字符,它只是一个控制条件。起初,我认为EOF就是字面意思即,到达了文件的结尾(End of File)。

概述


我们在使用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流的下一个字符。


  1. 函数返回类型为unsigned char(强制类型转换为int)正常情况下,是一个大于0的整数


  1. 如果到达文件末尾或发生错误,则返回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正常情况下,返回读取的字节数量;


  1. **0表示文件到达了末尾,Enf of File,Unix I/O EOF仅仅表示文件到达了末尾


  1. 返回值大于0,但小于count是正常的,表示文件剩余的字数量就是这么多;


  1. -1,表示read执行遇到到了错误,比如,被信号中断等。


网络编程中的EOF


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


相关文章
|
人工智能 自然语言处理 Java
Spring AI,搭建个人AI助手
本期主要是实操性内容,聊聊AI大模型,并使用Spring AI搭建属于自己的AI助手、知识库。本期所需的演示源码笔者托管在Gitee上(https://gitee.com/catoncloud/spring-ai-demo),读者朋友可自行查阅。
4036 44
Spring AI,搭建个人AI助手
|
人工智能 算法 编译器
AscendC从入门到精通系列(一)初步感知AscendC
Ascend C是CANN推出的一种编程语言,专为算子开发设计,支持C/C++标准,旨在提高开发效率与运行性能。通过Ascend C,开发者能在昇腾AI处理器上高效实现自定义算法。本文档介绍了如何使用Ascend C编写和运行一个简单的“Hello World”程序,包括核函数的编写、主程序调用及CMake配置,展示了Ascend C的基本使用流程。
|
存储 机器学习/深度学习 编解码
基于STM32的车牌识别系统
基于STM32的车牌识别系统
929 0
|
存储 消息中间件 SQL
Apache Flink 在国有大型银行智能运营场景下的应用
建信金融科技开发工程师周耀在 FFA 2021 的分享
Apache Flink 在国有大型银行智能运营场景下的应用
|
机器学习/深度学习 人工智能 弹性计算
五年磨一剑:阿里达摩院重磅推出AI模型社区「魔搭」,300+模型全面开源
五年磨一剑:阿里达摩院重磅推出AI模型社区「魔搭」,300+模型全面开源
1968 0
|
内存技术
设置node默认版本—踩坑
设置node默认版本—踩坑
1305 0
|
SQL JavaScript 前端开发
Springboot+Vue整合笔记【超详细】
目前很多公司的开发模式都是前后的分离的分工模式,这样能够做到各司其职,提高开发的效率。之前也有文章介绍了springboot项目和vue创建一个简单的前端项目,这篇文章则是将springboot和vue进行简单的整合,实现一个简单的登录页面。
6300 0
Springboot+Vue整合笔记【超详细】
|
Shell 开发工具 git
Git下载安装及IDEA整合Git
Git下载安装及IDEA整合Git
Git下载安装及IDEA整合Git
|
机器学习/深度学习 传感器 算法
基于模拟退火算法无人机药品配送路线规划(条件:距离近优先)附Matlab代码
基于模拟退火算法无人机药品配送路线规划(条件:距离近优先)附Matlab代码

热门文章

最新文章