在用 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 编程语言读入数组之前,如何嗅探二进制文件中的记录数?的主要内容,如果未能解决你的问题,请参考以下文章