【发布时间】:2014-01-29 19:08:03
【问题描述】:
C 规范有一个有趣的脚注(#268 C11dr §7.21.3 9)
“将文件位置指示器设置为文件结尾,与
fseek(file, 0, SEEK_END)一样,对于二进制流(因为可能出现尾随空字符)或任何具有与状态相关的编码但不确定的流具有未定义的行为以初始移位状态结束。”
这是否适用于读取文件的二进制流?(从物理设备)
IMO,磁盘上的二进制文件只是字节的海洋。在我看来,二进制文件不能具有与状态相关的编码,因为它是 binary 文件。我对“面向二进制宽的流”的概念以及它是否适用于磁盘 I/O 的概念很模糊。
我看到在串行流上调用fseek(file, 0, SEEK_END) (如com 端口)或stdin 可能无法达到真正的目的,因为结束 尚未确定。因此将问题缩小到物理文件。
[edit] 答:对老年人的担忧(可能直到 1980 年代后期)。目前在 2014 年,Windows、POSIT 特定和非异国情调的其他人:不是问题。
@Shafik Yaghmour 在Using fseek and ftell to determine the size of a file has a vulnerability? 中提供了很好的参考。 @Jerry Coffin 讨论了 CP/M 作为二进制文件并不总是具有精确的长度。 (每个 wiki 128 字节的记录)。
感谢@Keith Thompson 的回答。
这共同解释了规范的“(因为可能出现尾随空字符)”注释。
【问题讨论】: