在C中读取二进制文件时在数据之间获取零

时间:2011-01-16 07:41:32

标签: c binary

我有一个二进制数据,我正在使用C程序读入一个长整数数组。

二进制数据的hexdump显示,在前几个数据点之后,它再次从20000十六进制地址开始。 hexdump输出如下所示。

0000000 0000 0000 0000 0000 0000 0000 0000 0000
*
0020000 0000 0000 0053 0000 0064 0000 006b 0000
0020010 0066 0000 0068 0000 0066 0000 005d 0000
0020020 0087 0000 0059 0000 0062 0000 0066 0000

......等等...... 但是当我通过典型的fread命令

将其读入长整数数组'数据'时
fread(data,sizeof(*data),filelength/sizeof(*data),fd);

它填满了我的数据阵列中的所有零,直到它到达20000位置。之后,它正确读取数据。 为什么要读取我的文件不存在的区域?或者我如何才能使它只读取我的文件,而不是文件之间的任何内容?

我知道这看起来像是一个微不足道的问题,但即使经过一天晚上的谷歌搜索,我也无法弄明白。 任何人都可以建议我在哪里做错了吗?

其他信息:我正在研究GNU / Linux机器。 (slax-atma发行版具体)。我的C编译器是gcc。

2 个答案:

答案 0 :(得分:5)

十六进制转储输出显示数据的第一行(16字节)全为零; ' *'表示以下行是相同的,直到您到达偏移量0x0020000。所以,你的文件的开头都是零。

读取调用读取文件,就像磁盘上存在零一样,因为定义了Unix / Linux接口。它们是否存储在磁盘上并不重要;就你的节目而言,他们就在那里。

如果你想跳过全部零'文件的一部分,然后最好不要在开始时用全零写入文件。如果做不到这一点,你必须决定如何以块的形式读取数据,直到你开始找到非零信息 - 或者使用固定的偏移来跳过零。

因此,Unix和Linux上的文件系统抽象意味着读取零,无论它们是否物理存储在磁盘上。要跳过它们,你必须知道你想要怎么做 - 要么知道有多少,要么通过它们,或者通过阅读和丢弃数据。

答案 1 :(得分:2)

你问"为什么要读取我的文件不存在的地区?"

但你错了。零是文件中的有效数据。所以它读取那些零。它行为正确。

如果你想跳过零,你必须一个接一个地跳过一个数字,如果它是零则跳过它。您还可以将整个数据集读入内存,然后将其缩小(这需要更多内存,但比从磁盘逐个读取数字更快)。