在文章 <7khuqi$a72$1@nnrp1.deja.com> 中,Syco 写道:
> 是的,我读过 FAQ 的那部分……
> 它没有说明如何找到文件大小,至少没有以一种可移植的
> 方式说明,而这却是必需的,因为我正在 Windows
> 机器上进行编程,但我认为我将不得不在 SCO Unix
> 机器上编译它。
如果有一种可移植的文件大小确定方法,相信我,FAQ 列表一定会提到的。
确定文件“大小”的唯一可移植方法是打开它,读取它,然后计算字符数,但这 (a) 可能无法给出你想要的结果,并且 (b) 可能会极其、毫无必要地低效。
如果你确实需要提前知道文件的大小,那就继续使用特定于操作系统的(因此不具可移植性的)方法。在类 Unix 和符合 Posix 的系统下,请务必使用stat()(或者也许fstat). stat()在我用过的 MS-DOS 编译器下也存在。(但我无法帮助你处理 Windows。)
但是,如果你需要提前知道文件大小是为了能够 malloc 一个足够大的缓冲区来一次性读取文件,那么你还有另外两种选择。一种是顺序处理文件,而不是一次性读取;毕竟,一次性读取文件并不总是最佳选择。另一种选择是,如果你能猜到文件的大小,或者以某种方式得到一个近似值(例如,stat()在 MS-DOS 下,由于 CRLF <=>\n翻译,会给出“错误”的大小),那么你可以相当容易地编写一些代码,先 malloc 大约的空间,开始读取文件,并在必要时重新分配。如果你想看到这方面的详细说明,请参阅我的 C Programming Notes 第 11.3 节,网址是 http://www.eskimo.com/~scs/cclass/cclass.html,以及入门作业 6 的答案。(那里的示例展示了如何逐行读取文件,而不是作为一个连续的块读取,但它们应该能给你一些启示。)
偶尔,你可能需要编写代码来读取文件两次(一次计算其中的字符数,第二次在你精确知道有多少字符后,对它们执行操作),但这应该是最后的手段,因为它可能会导致严重的性能问题,至少对于大文件来说是这样。
Steve Summit