【发布时间】:2016-10-28 07:59:24
【问题描述】:
基本上只是标题。我正在尝试检查文件是否为空。问题是,这个文件会在几天内变得非常庞大(~1GB+),我觉得
fseek(fp,0,SEEK_END);
if(ftell(fp)==0){//init file}
rewind(fp);
//actually read the file
时间很宝贵,因为您必须遍历整个文件。我也不想使用系统调用,因为我通常使用 Java,并尝试尽可能独立于平台工作(即不必为每个平台重写它,而只需重新编译它)。如果这根本不用担心,并且 fseek()... 可以轻松处理这些文件大小,请告诉我,但我认为这很耗时。
【问题讨论】:
-
只读取第一个字节。如果是
EOF,则文件为空。 -
fseek(fp,0,SEEK_END)不一定很慢,即使对于大文件也是如此。fseek不需要“运行”整个文件。将文件视为 CD-Rom 而不是磁带。但正如之前的评论所说:读取第一个字节就足以确定文件是否为空。 -
@TahaPaksu 除非我完全误会 fstat 是一个系统调用,我目前正试图避免
-
你存储的是实际的素数,还是一个状态位图?如果是前者,您将不得不搜索整个文件(可能是二分搜索),而在后者中,您可以直接查找状态位所在的位置。如果您当前存储的是 64 位值,该文件甚至可能更小,因为素数的频率超过 64 分之一。
-
@JacobusConradi 无论如何你都不能完全避免系统调用,因为即使读取文件最终也会使用系统调用。