gpt4 book ai didi

c++ - 如果我将结构的 int 成员转换为 char* 以对其进行序列化,那么在反序列化时是否应该将其转换为 int* 类型?

转载 作者:行者123 更新时间:2023-12-02 10:02:22 25 4
gpt4 key购买 nike

结构日期有两个 int结构的写入函数使用的类型reinterpret_cast<char*>()将其存储在磁盘上。从磁盘再次读取它并将其存储为int结构的变量,我应该不 reinterpret_cast int day变量为 <int*>正确存放它?
像这样:

os.write(reinterpret_cast<char*>(&day),sizeof(day)); //to cast it into char* to store it in file

并且,像这样反序列化它:
is.read(reinterpret_cast<int*>(&day),sizeof(day)); //to cast it into char* to read it from file

代替:
is.read(reinterpret_cast<char*>(&day),sizeof(day)); //which just converts it back to char* to read from file

原因是我希望能够对 int day 执行算术运算。 .

这是我的代码:
struct date{
int day;
string month;
int year;

void read(istream &is) // to deserialize date and read it from disk
{
is.read(reinterpret_cast<char*>(&day), sizeof(day));
size_t size;
if (is.read(reinterpret_cast<char*>(&size), sizeof(size)))
{
month.resize(size);
is.read(&month[0], size);
}
is.read(reinterpret_cast<char*>(&year), sizeof(year));
}

void write(ostream &os) const //to serialize struct date
{
os.write(reinterpret_cast<const char*>(&day), sizeof(day));
size_t size = month.size();
os.write(reinterpret_cast<const char*>(&size), sizeof(size));
os.write(month.c_str(), size);
os.write(reinterpret_cast<const char*>(&year), sizeof(year));
}
};

最佳答案

你的代码没问题,没有理由担心 day (或 year )被解释为 int 以外的任何内容被宣布为。

在对 is.read 的调用中和 os.write ,您要转换的唯一内容(到 char* 指针)是传递的 地址 day多变的。这与下面的参数(sizeof(day))一起告诉那些调用读/写适当的字节数(char 总是一个字节,sizeof 运算符给出字节大小)到/从给定的地址。

所以,如果(很常见),int在您的编译器/平台上是 4 个字节,然后将从流中读取 4 个字符并放置在给定的地址 - 整数的四个“组件”字节将被放置到为该整数分配的内存中。

类型转换 char *是必需的,因为 STL 定义 read()write()函数采用这样的指针。这是因为流是在逐个字符的基础上实现的;因此,要读取任何其他类型的变量,您需要转换其地址,并提供该类型的相关大小。

关于c++ - 如果我将结构的 int 成员转换为 char* 以对其进行序列化,那么在反序列化时是否应该将其转换为 int* 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62005554/

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