我倾向于同意他们的基本结论,即您通常不应该在代码的主流中直接使用fseek
/ftell
代码——但您可能也不应该使用fstat
。如果你想要一个文件的大小,你的大部分代码应该使用一个清晰、直接的名字,比如filesize
.
现在,使用可用的地方和(例如)在 Windows(通常不可用的最明显平台)上实现它可能会更好。fstat
FindFirstFile
fstat
故事的另一面是fseek
关于二进制文件的许多(大多数?)限制实际上起源于 CP/M,它没有在任何地方明确存储文件的大小。文本文件的结束由 control-Z 表示。然而,对于二进制文件,您真正知道的只是哪些扇区用于存储文件。在最后一个扇区中,您有一些经常(但不总是)填零的未使用数据。不幸的是,可能有重要的零和/或不重要的非零值。
如果整个 C 标准是在被批准之前编写的(例如,如果它是在 1988 年开始并在 1989 年完成的),他们可能会完全忽略 CP/M。然而,无论好坏,他们在大约 1982 年左右开始研究 C 标准,当时 CP/M 的使用范围仍然足够广泛,以至于它不能被忽视。到 CP/M 离开时,许多决定已经做出,我怀疑有人想重新审视它们。
然而,对于今天的大多数人来说,这是没有意义的——如果没有大量工作,大多数代码都不会移植到 CP/M;这是要处理的相对较小的问题之一。让现代程序在仅 48K(左右)的内存中运行代码和数据是一个更严重的问题(对于大容量存储来说,最大大约 1 兆字节将是另一个严重的问题)。
不过,CERT 确实有一个好处:您可能不应该(通常这样做)找到文件的大小,分配那么多空间,然后假设文件的内容适合那里。即使 fseek/ftell 可以为您提供现代系统的正确大小,但在您实际读取数据时,该数据可能已经过时,因此无论如何您都可能超出缓冲区。