C 二进制文件读取:我应该移动多少字节?
C Binary File Reading: How many bytes should I move?
假设我有一个用 C 语言处理二进制文件的程序。
假设我在这个二进制文件中有8个对象(每个对象都是一个struct record类型),我已经读取了8的前3个对象。(通过读取8的3个对象我的意思是我已经读取了它并将它们存储到数组中)
我知道为了稍后读取二进制文件的内容,我必须使用 fseek 调用来实现这个目标。我感到困惑的是,假设我想读取 8 的第 4 个对象,我应该使用 fseek 调用 move/skip 多少 bytes/objects?
我应该打电话吗
fseek(fp, sizeof(struct record) * 3, SEEK_SET);
或
fseek(fp, sizeof(struct record) * 4, SEEK_SET);
通常最好将这些内容写下来以了解内存映射的工作原理,所以让我们尝试表示文件(假设每个结构的大小为 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) )
希望它更清楚...
假设我有一个用 C 语言处理二进制文件的程序。
假设我在这个二进制文件中有8个对象(每个对象都是一个struct record类型),我已经读取了8的前3个对象。(通过读取8的3个对象我的意思是我已经读取了它并将它们存储到数组中)
我知道为了稍后读取二进制文件的内容,我必须使用 fseek 调用来实现这个目标。我感到困惑的是,假设我想读取 8 的第 4 个对象,我应该使用 fseek 调用 move/skip 多少 bytes/objects?
我应该打电话吗
fseek(fp, sizeof(struct record) * 3, SEEK_SET);
或
fseek(fp, sizeof(struct record) * 4, SEEK_SET);
通常最好将这些内容写下来以了解内存映射的工作原理,所以让我们尝试表示文件(假设每个结构的大小为 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) )
希望它更清楚...