C规范有一个有趣的脚注(#268 C11dr§7.21.39)
“与一样,将文件位置指示符设置为文件末尾fseek(file, 0, SEEK_END)对于二进制流(由于可能存在尾随空字符)或具有状态相关编码的任何流(肯定不能以初始移位状态结束)都具有不确定的行为”。
这是否适用于读取文件的二进制流?(如来自物理设备)
IMO,磁盘上的二进制文件只是字节的海洋。在我看来,二进制文件不能具有状态相关的编码,因为它是二进制文件。我对“二进制面向广泛的流”的概念不甚了解,是否甚至可以将其应用于磁盘I / O。
我看到fseek(file, 0, SEEK_END)在像COM端口这样的串行流上进行调用,或者stdin可能尚未到达真正的终点,因为终点尚未确定。因此,将问题范围缩小到了物理文件。
[edit]答案:与年长者有关(可能直到1980年代后期)。目前,在2014年,Windows,POSIT特定和非特殊的其他:没问题。
@shafik Yaghmour在使用fseek和ftell确定文件大小是否存在漏洞方面提供了很好的参考?。@Jerry Coffin在这里讨论CP / M作为二进制文件,但并不总是具有精确的长度。(每个Wiki 128字节记录)。
感谢@Keith Thompson的答案。
这一起解释了规范的“(由于可能带有结尾的空字符)”注释。