Как записать из массива кучи ВНУТРЕННЮЮ СТРУКТУРУ? - PullRequest
0 голосов
/ 13 октября 2019

Проблема с fwrite() извлечением из памяти кучи заключается в том, что вы буквально просто пишете указатель на данные. Возможно восстановить те же данные при повторном выполнении кода. Но ничто не гарантирует, что указатель будет таким же, как указатель на старые данные. Мне нужна помощь fwrite() в куче памяти.

struct {
    char SomeStringData[12];
    struct LittleStruct* LittleStructArray;
} BigStruct = {
    .SomeStringData = "HELLO WORLD",
    .LittleStructArray = malloc(sizeof (struct LittleStruct)*NumberOfArrayElements);
}

fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);

1 Ответ

2 голосов
/ 13 октября 2019

Когда вы пишете с использованием fwrite, вас интересует только то, что содержимое того места, на которое указывает указатель, записывается на диск. Когда вы читаете из одного и того же файла, вам, как правило, все равно, где в памяти считываются данные.

 char* p = malloc(10); // some arbitrary address on the heap
 strcpy(p, "hello");
 fwrite(p, 1, 6, somefilepointer); // now what p points to is written

когда вы сейчас читаете с использованием фреда, значения помещаются там, где q.

 char* q = malloc(10); // some other arbitrary address on the heap
 fread(q, 1, 6, somefilepointer); 

РЕДАКТИРОВАТЬ : после того, как вопрос был изменен.

Когда вы снова разместите внутри своей структуры, вам нужно будет написать эту часть отдельно, так как она будет существовать в другой частикуча. fwrite записывает только последовательные байты, поэтому запись вашей структуры будет выглядеть примерно так:

fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);
fwrite(BigStruct.LittleStructArray, 
  sizeof(BigStruct.LittleStructArray), NumberOfArrayElements, DataFile);

лучше

fwrite(BigStruct.SomeStringData, 1, sizeof(SomeStringData), DataFile);
fwrite(BigStruct.LittleStructArray, 
  sizeof(BigStruct.LittleStructArray), NumberOfArrayElements, DataFile);
...