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

ind*_*joe 0 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
Run Code Online (Sandbox Code Playgroud)

...等等...但是当我通过典型fread命令将其读入长整数数组'数据'时

fread(data,sizeof(*data),filelength/sizeof(*data),fd);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jon*_*ler 5

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

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

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

因此,Unix和Linux上的文件系统抽象意味着读取零,无论它们是否物理存储在磁盘上.要跳过它们,您必须知道您希望如何做到这一点 - 通过了解有多少并寻找过去,或者通过阅读和丢弃数据.