Hum*_*man 12 c pointers file feof fgetc
我打开了一个文件,在指针的地址找到了流ptr.我试图查看文件是否为空.使用以下内容
if (fgetc(ptr) != EOF)
Run Code Online (Sandbox Code Playgroud)
按预期工作.当文件为空时,不执行该语句.当文件不为空时,不执行该语句.
但是,使用
if (!feof(ptr))
Run Code Online (Sandbox Code Playgroud)
总是执行声明.
为什么会这样?有没有办法使用这个feof功能?
Kei*_*son 15
有没有办法使用这个
feof功能?
就在这里. 在输入函数返回一个值,表明它没有更多要处理的输入后,您可以调用feof()和/或ferror()确定条件是由达到输入结束还是某些错误条件引起的.
这是feof()和ferror()函数的唯一有效用途.
结果表明不再有输入的输入因功能而异.例如,fgets()返回值EOF,同时fread()返回一些小于请求的记录数的值.您需要阅读每个输入函数的文档以了解它的工作原理.
在C标准库中,"文件结束"不是一个独立的自检条件."文件结束"仅仅是由前面的读操作设置的文件状态.在执行读取操作之前,直到读取操作碰到文件的实际结尾,"eof"状态未设置并feof()返回0.
C标准库中的许多(大多数)标准I/O函数已经返回一些完成代码,可用于检测"文件结束"条件(如fgetc()返回EOF值).这意味着大多数时间调用feof()是不必要的.
换句话说,如果您将"文件结束"视为砖墙,在C标准库中,仅仅站在该墙前面以检测它是不够的.为了发现它的存在,有必要用你的额头撞到那堵墙.
当您打开一个空文件时,您将开始处于"就在墙前"的状态.此时尚未检测到"文件结束"条件.你必须尝试阅读一些东西,以便撞到那堵墙,从而检测它的存在.
这种设计的原因是完全合乎逻辑的.C语言被设计为支持各种输入流和文件系统,包括:1)不存储的文件大小在所有文件系统,以及2)只知道近似文件大小(如圆形到最近的簇)的文件系统.在这种文件系统中,文件末尾通常由特殊标记指定.在读取文件时遇到标记之前,您不知道该标记的位置.(出于同样的原因,C流不保证支持从函数SEEK_END原点定位fseek.)
正如@Barmar在评论中指出的那样,没有预先确定的"文件结束"位置的输入流的更好示例是链接到终端的标准输入.