如何从结构内部的堆内存数组中进行fwrite?
How to fwrite from heap memory array INSIDE STRUCT?
从堆内存中 fwrite()
ing 的问题是你实际上只是在写一个指向数据的指针。再次执行代码时可能会恢复相同的数据。但是没有什么能保证指针与指向旧数据的指针相同。我需要帮助 fwrite()
处理堆内存。
struct {
char SomeStringData[12];
struct LittleStruct* LittleStructArray;
} BigStruct = {
.SomeStringData = "HELLO WORLD",
.LittleStructArray = malloc(sizeof (struct LittleStruct)*NumberOfArrayElements);
}
fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);
当你用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
当您现在使用 fread 读取时,值将放在 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);
从堆内存中 fwrite()
ing 的问题是你实际上只是在写一个指向数据的指针。再次执行代码时可能会恢复相同的数据。但是没有什么能保证指针与指向旧数据的指针相同。我需要帮助 fwrite()
处理堆内存。
struct {
char SomeStringData[12];
struct LittleStruct* LittleStructArray;
} BigStruct = {
.SomeStringData = "HELLO WORLD",
.LittleStructArray = malloc(sizeof (struct LittleStruct)*NumberOfArrayElements);
}
fwrite(&BigStruct, sizeof(BigStruct), 1, DataFile);
当你用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
当您现在使用 fread 读取时,值将放在 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);