C Чтение двоичных файлов: сколько байтов мне нужно переместить? - PullRequest
0 голосов
/ 18 марта 2019

Предположим, у меня есть программа, которая работает с двоичными файлами на языке C.

Предположим, у меня есть 8 объектов (каждый объект имеет тип записи struct) в этом двоичном файле, и я прочитал первые 3 объектаиз 8. (Читая 3 объекта из 8, я имею в виду, что я прочитал его и сохранил их в массив)

Я знаю, чтобы прочитать содержимое двоичного файла позже, я должен использовать вызов fseekдля достижения этой цели.Что меня смущает, так это предположим, что я хочу прочитать 4-й объект из 8, сколько байтов / объектов я должен переместить / пропустить, используя вызов fseek?

Должен ли я позвонить

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

или

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

1 Ответ

0 голосов
/ 18 марта 2019

обычно лучше записать эти вещи, чтобы понять, как работает отображение памяти, поэтому давайте попробуем представить файл (при условии, что каждая структура имеет размер 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) )

надеюсь, это прояснит ...

...