2

例如,在打开文件并将记录读入数组之前,如何更好地判断二进制文件中有多少条记录?

MyFile = fopen("DATA.dat", "rb");
i = 0;
while (feof(MyFile) == 0) {
   fread(&tempReadingRecord,sizeof(tempReadingRecord), 1, file);
     if (feof(MyFile) == 0 {
     i++;
     }
   }
 fclose(MyFile);
}
printf("%d", i); /* does work to find out how many records but optimal? */
4

4 回答 4

6

鉴于您显然正在处理固定大小的记录的整个文件,您可以寻找到文件的末尾,获取当前位置,然后除以记录大小。从理论上讲,这存在可移植性问题(二进制文件可以包含任意数量的 NUL 附加到其末尾),但实际上您不会在大多数常见系统上遇到问题(AFAIK,主要发生在 CP/M 上,没有明确存储文件长度,只是一些块,所以文件的末尾总是被填充以填充最后一个块)。

顺便说一句,您用于读取记录的循环有问题——事实上,几乎任何 sort 循环while (!feof(file))或任何类似的循环都几乎可以保证无法正常工作(通常它会“读取”最后一条记录两次)。

于 2009-11-30T21:01:10.717 回答
4

如果您正在处理仅包含固定大小记录的整个文件(似乎是这种情况),您可以使用 stat 获取文件的总大小。stat 从文件系统本身获取此信息,因此,您无需提前打开文件。在我的 linux 机器上,这个程序可以解决问题:


int main() {

   const char * const filename = "/bin/ls";

   struct stat buf;

   if ( 0 == stat(filename, &buf) ) {
      printf("File: %s - Size: %d\n", filename, buf.st_size);
   }

   return 0;

}

上面的程序打印二进制 ls 的总大小。获得文件的总大小后,您需要做的就是将其除以表示记录的结构的大小。这将为您提供文件中的记录总数。

于 2009-11-30T22:35:57.773 回答
2

它们是什么样的记录?

如果它们是固定长度,则取文件大小,然后除以记录大小。

于 2009-11-30T20:58:19.000 回答
0

如果它们是固定大小的,请使用 Jerry 的解决方案,否则按原样阅读它们是我能想到的唯一方法。顺便说一句,是否存在您将/不会根据对象数量读取文件的情况?

于 2009-12-01T03:21:07.997 回答