gpt4 book ai didi

c++ - 如何将多个对象(或任何数据)读写到缓冲区?

转载 作者:搜寻专家 更新时间:2023-10-31 01:38:48 25 4
gpt4 key购买 nike

我正在编写一个程序来将一些对象(结构)保存到缓冲区。我没有实验写很多对象来缓冲并从缓冲区中读取这些对象。任何帮助,将不胜感激。我的代码可以将一个项目写入对象,我想将多个对象写入缓冲区

struct PointFull {
double lat;
double lon;
};

PointFull item1;
PointFull item2;
PointFull item3;
PointFull item4;
PointFull item5;

void* buffer = malloc(sizeof (PointFull));
int fd = open("output", O_WRONLY | O_CREAT, S_IWUSR | S_IRUSR);
if (fd < 0) {
printf("Error opening file\n");
return 1;
}

//The below function can write only one item to buffer. How to write 5 item (from item1 to item5) to the buffer
//memcpy(buffer, &item1, sizeof (item));

write(fd, buffer, sizeof (item));

现在我的硬盘中有一个名为“output”的文件,然后我想读取这个文件来测试数据。

    int fd2 = open("output", O_RDONLY, S_IWUSR | S_IRUSR);
if (fd2 < 0) {
printf("Error opening file\n");
return 1;
}
void* bufferRead;
bufferRead = malloc(5* sizeof (PointFull));
read(fd2, bufferRead,sizeof (PointFull));

目前,我有 bufferRead 包含 5 个项目,但我不知道如何读取缓冲区以将数据插入结构???请帮助我!

最佳答案

那么你要做的是序列化。假设你有这样的结构:

struct PointFull {
int lat;
int lon;
};

还有

PointFull item1, item2;

将其序列化到缓冲区的方式是:

unsigned char arr[20] = {0};
memcpy(arr, &item1.lat, sizeof(int));
memcpy(&arr[1 * sizeof(int)], &item1.lon, sizeof(int));
memcpy(&arr[2 * sizeof(int)], &item2.lat, sizeof(int));
memcpy(&arr[3 * sizeof(int)], &item2.lon, sizeof(int));

我之所以这样序列化,是因为由于填充问题,直接按照您的建议编写结构不是个好主意。这些结构可能有填充,并且它们可能因系统而异。

现在,您有了字节数组(其中包含两个 PointFull 对象 - 对于更多对象,您将采用类似的方法)并且您可以在写入中使用它:

write(fd, arr, 20);

读取字节数组后,您可以使用类似上面的 memcpy 调用来重建点对象(现在只是目标是点对象成员)。但问题是二进制整数序列化是不可移植的(而且是 float 的)——在不同的系统上,整数可能有不同的大小、不同的字节顺序。对于 float ,它们的表示可能会有所不同。

无论如何,有一种方法可以将 float 编码为二进制 here - 检查 pack754(和类似的解包)功能。如果您使用该函数序列化字节数组中的 float 并像此答案中那样分别序列化每个 float ,那么也许您会没事的。

<子>附言。这里is解释序列化的帖子(对于 float 编码部分,您可以在我的回答中使用链接)。

关于c++ - 如何将多个对象(或任何数据)读写到缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32243313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com