这个结构的date有两个 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)
)告诉这些调用要读写适当数量的字节(a char
总是 一个字节和 sizeof
操作符给出了以 字节数)成from给定的地址。
所以,如果(很常见),如果一个 int
在你的编译器平台上是4个字节,那么4个字符将被从流中读取并放置在给定的地址上--整数的4个 "组件 "字节将被放置到为该整数分配的内存中。
投放到 char *
是必须的,因为STL定义了 read()
和 write()
函数都会取这样一个指针。这是因为流是在逐个字符的基础上实现的,因此,如果要读取任何其他类型的变量,你需要抛出它的地址,并提供该类型的相关大小。