我是C++的初学者,并试图更好地理解feof().我已经读过,feof()只有在尝试读取文件末尾之后才会将该标志设置为true,这样很多次初学者会比他们期望的那样多读一次while(!feof(file)).我试图理解的是,它实际上是如何解释已经尝试读取文件的末尾?整个文件是否已经读入并且已知的字符数或是否有其他机制在起作用?
我意识到这可能是一个重复的问题,但我一直无法找到它,可能是因为我不知道最好的方式来说出我要问的内容.如果已经有答案,那么链接将非常受欢迎.谢谢.
Dav*_*rtz 10
无论C++库做什么,最终都必须从文件中读取.在操作系统的某个地方,有一段代码最终处理该读取.它从文件系统获取文件的长度,以与文件系统存储其他所有内容相同的方式存储.知道文件的长度,读取的位置以及要读取的字节数,就可以确定低级读取是否到达文件的末尾.
当做出该确定时,它将向上传递.最终,它进入标准库,在内部记录已到达文件末尾.当对库的读取请求尝试超过该记录的结束时,EOF标志被设置feof并将开始返回true.
feof()是标准C库缓冲 I/O的一部分.因为它是缓冲的,所以fread()预先读取一些数据(但绝对不是整个文件).如果在缓冲时fread()检测到EOF(底层OS例程通常会返回一个特殊值-1),它会在FILE结构上设置一个标志.feof()只需检查该标志.因此feof()返回true实质上意味着"先前的读取尝试遇到文件结束".
如何检测EOF是特定于OS/FS的,并且与C库/语言无关.操作系统有一些从文件中读取数据的接口.C库只是操作系统和程序之间的桥梁,因此如果转移到另一个操作系统,则无需更改程序.操作系统知道文件如何存储在其文件系统中,因此它知道如何检测EOF.我的猜测通常是通过比较当前位置和文件长度来执行,但它可能不是那么容易,可能涉及很多低级细节(例如,如果文件在网络驱动器上,该怎么办? ?).
一个有趣的问题是当流结束时会发生什么,但是任何读取都没有检测到它.例如,如果您打开一个空文件.feof()在任何fread()返回之前第一次调用是真还是假?答案可能是错误的.关于这个问题,文档并不十分清楚:
此指示符通常由尝试在文件结尾处读取或超过文件结尾的流上的先前操作设置.
听起来好像特定实现可能会选择其他一些不寻常的方法来设置此标志.