C二进制文件读取:我应该移动多少字节?

问题描述 投票:0回答:1

假设我有一个使用C语言的二进制文件的程序。

假设我在这个二进制文件中有8个对象(每个对象是结构记录类型),并且我已经阅读了8的前3个对象。(通过阅读8个对象,我的意思是我已经读过它并将它们存储到阵列)

我知道为了以后读取二进制文件的内容,我必须使用fseek调用来实现这个目标。我感到困惑的是,假设我想读取8的第4个对象,我应该使用fseek调用移动/跳过多少字节/对象?

我应该打电话吗?

fseek(fp, sizeof(struct record) * 3, SEEK_SET);

要么

fseek(fp, sizeof(struct record) * 4, SEEK_SET);
c binaryfiles fseek
1个回答
0
投票

通常最好先编写这些内容以了解内存映射的工作原理,让我们尝试表示文件(假设每个结构的大小为4个字节):

byte:   |A-0|A-1|A-2|A-3|B-0|B-1|B-2|B-3|C-0|C-1|C-2|C-3|D-0|D-1|D-2|D-3|E....
        ----------------------------------------------------------------------
struct: | struct A      |struct B       |struct C       |struct D       |s...
        ----------------------------------------------------------------------
address:0   1   2   3   4   5   6   7   8   9  10   11  12  13  14  15  16

从视觉表示中可以看出,该文件是基于0的索引,即第一个结构位于地址0 (sizeof(struct record) * 0),第二个结构位于地址4 (sizeof(struct record) *1),依此类推......

从这里可以推导出第n个元素offset = ( sizeof(struct record) * ( n - 1) )

希望它能让它更清晰......

© www.soinside.com 2019 - 2024. All rights reserved.