在用 C 编程语言读入数组之前,如何嗅探二进制文件中的记录数?

Posted

技术标签:

【中文标题】在用 C 编程语言读入数组之前,如何嗅探二进制文件中的记录数?【英文标题】:How to sniff the number of records in a binary file before reading into an array in the C programming language? 【发布时间】:2009-11-30 20:55:43 【问题描述】:

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

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? */

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

+1 为 feof。您应该改用读取的返回值。【参考方案2】:

如果您正在处理仅包含固定大小记录的整个文件(似乎是这种情况),您可以使用 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 的总大小。获得文件的总大小后,您需要做的就是将其除以表示记录的结构的大小。这将为您提供文件中的记录总数。

【讨论】:

【参考方案3】:

它们是什么类型的记录?

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于在用 C 编程语言读入数组之前,如何嗅探二进制文件中的记录数?的主要内容,如果未能解决你的问题,请参考以下文章

学生成绩管理系统C语言不用链表而用结构体数组如何实现

Windows C++ API:如何将整个二进制文件读入缓冲区?

C语言中如何将一个数组导入到文件中?

VB6.0中如何实现逐行读入文本文件?

C++文件简单读入读出测试

C语言中从广西读入未知长度的数字,放个数组