我有一个结构体,并使用write()将其写入文件。
struct PointFull {
double lat;
double lon;
};
PointFull item;
void* buffer = malloc(sizeof (item));
int fd = open("output", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR);
if (fd < 0) {
printf("Error opening file\n");
return 1;
}
memcpy(buffer, &item, sizeof (item));
write(fd2, buffer, sizeof (item));
字符串
现在我有一个名为“输出”的文件在硬盘上,然后我想读取文件来测试数据。
int fd2 = open("output", O_RDONLY, S_IWUSR | S_IRUSR);
if (fd2 < 0) {
printf("Error opening file\n");
return 1;
}
void* bufferRead;
bufferRead = malloc(100);
read(fd2, bufferRead,100);
型
目前,我有bufferRead,但我不知道如何读取缓冲区插入数据到结构?
4条答案
按热度按时间d6kp6zgx1#
1.您宁愿分配大小为
sizeof(PointFull)
的缓冲区。因为如果结构体的大小被改变,变得比你硬编码的大小更大,那么你就会得到一个bug。1.除非你真的需要使用动态内存,否则使用本地缓冲区。我假设在您的代码中并不真正需要分配。只是你可能很容易忘记释放内存,而缓冲区在函数返回时会自动删除。
字符串
还要注意:你的结构可能会通过插入一个填充来对齐。虽然我不认为PointFull会是这种情况,但无论如何,当你需要像这里这样序列化结构时,你最好用
#pragma pack
声明它,以不允许填充。例如:型
67up9zun2#
既然你已经标记了C++
字符串
mepcadol3#
下面是相同的示例代码。
字符串
sd2nnvve4#
MIT有一个名为'drake'的库具有此功能。您必须采取一些步骤来序列化结构,但它们的文档似乎相当不错!