#c #struct #binaryfiles
#c #struct #двоичные файлы
Вопрос:
В настоящее время я сталкиваюсь с проблемой, когда я хочу сохранить структуру в двоичном файле, но размер структуры каждый раз кажется неправильным.
Вот код моей структуры :
typedef struct {
int lines;
int columns;
int ** matrix;
char * name;
} labyrinthe;
И вот как я сохраняю его в файле :
void writeInFile (labyrinthe * l, FILE * f) {
fwrite(l, sizeof(l), 1, f); //already tried with amp;l instead of l
}
Однако файл всегда содержит ровно 22 байта, даже если размер матрицы равен сетке 111 * 111. Любая помощь будет очень признательна.
Спасибо за чтение.
Комментарии:
1. L — это указатель, и вы принимаете размер указанного указателя. Попробуйте *l в sizeof . Однако у вас есть большие проблемы, поскольку ваша структура тоже содержит указатели. Вам нужно как-то ее маршалировать, а это непросто.
2. Вы не сохраните данные таким образом, они должны быть поданы так же, как
struct
и, но указатели будут неактуальны. Данные не являются частью структуры, только указатели на то, где данные на самом деле находятся в памяти. Когда вы позже прочитаете данные обратно, вам придется снова выделить память, как вы делали изначально. Таким образом, вы должны подать данные таким образом, чтобы вы могли воссоздать имеющуюся у вас структуру данных при чтении ее из файла.
Ответ №1:
Ну, на самом деле структура хранит именно то, что вы говорите ей хранить, и это:
2 целых числа, один указатель int (который указывает на другой указатель) и указатель на символ, и я думаю, что в вашей системе sizeof(int)= 4 и sizeof(type *) = 8, и именно поэтому в вашем файле будет 24 байта.
Чтобы сделать это более понятным, взгляните на это:
#include<stdlib.h>
#include<stdio.h>
typedef struct {
int lines;
int columns;
int ** matrix;
char * name;
} labyrinthe;
int main(void)
{
FILE *f = fopen("file","w b");
labyrinthe *l;
l=malloc(sizeof(labyrinthe));
l->lines=1;
l->columns=2;
l->matrix = 0xABCDABCDABCDABCD;
l->name = 0x5000B00B;
fwrite(l, sizeof(*l), 1, f);
return 0;
}
И шестнадцатеричный дамп файла выглядит следующим образом (порядок байтов изменен из-за последовательности)
|lines4b | columns 4b | matrix 8 bytes | name 8 bytes |
0001 0000 0002 0000 abcd abcd abcd abcd b00b 5000 0000 0000
Фактическое содержимое того, что находится в матрице и имени, хранится в другом месте в памяти, и эти указатели в структуре просто указывают на это место.