Boost c++的序列化
Serialization of Boost c++
要序列化文件,我该怎么做?我是否需要创建一个函数来循环遍历文件名并将其序列化为一个文件?
默认情况下,std::ofstream 以输出模式打开,这意味着文件在打开时将被截断为零长度。您可以在打开文件时通过位标志控制此行为:
https://en.cppreference.com/w/cpp/io/ios_base/openmode
在这种情况下,尝试按以下方式打开后续输出文件,看看它是否解决了您的问题,因为添加“app”标志将允许您追加到文件,而不是覆盖它:
std::ofstream out{ "Categories.txt", std::ios_base::out | std::ios_base::app };
另一种可能是添加“in”标志,这将保留文件内容,并在打开文件时立即查找到结尾:
std::ofstream{ "Categories.txt", std::ios_base::out | std::ios_base::in | std::ios_base::ate };
不同之处在于“app”应该始终正确附加,即使多个流引用同一个文件,而“in | ate”仍然允许您四处移动并在文件中写入您想要/必要的地方.
Boost 序列化的简洁答案是
std::ofstream readFile("Categories.txt");
{
boost::archive::text_oarchive ar(readFile);
ar << vec;
ar << another_object;
ar << yet_another_object;
} // note destructs `ar`
readFile.close();
请注意,在关闭文件之前,您应该确保存档已完成。可悲的是,这是由 aarchive 析构函数处理的,因此您总是会遇到这种笨拙的生命周期舞蹈。
当然,文件在离开作用域时会自动关闭,因此您可以不使用 readFile.close()
。
在单个流中合并多个档案:
- Outputting more things than a Polymorphic Text Archive
要序列化文件,我该怎么做?我是否需要创建一个函数来循环遍历文件名并将其序列化为一个文件?
默认情况下,std::ofstream 以输出模式打开,这意味着文件在打开时将被截断为零长度。您可以在打开文件时通过位标志控制此行为:
https://en.cppreference.com/w/cpp/io/ios_base/openmode
在这种情况下,尝试按以下方式打开后续输出文件,看看它是否解决了您的问题,因为添加“app”标志将允许您追加到文件,而不是覆盖它:
std::ofstream out{ "Categories.txt", std::ios_base::out | std::ios_base::app };
另一种可能是添加“in”标志,这将保留文件内容,并在打开文件时立即查找到结尾:
std::ofstream{ "Categories.txt", std::ios_base::out | std::ios_base::in | std::ios_base::ate };
不同之处在于“app”应该始终正确附加,即使多个流引用同一个文件,而“in | ate”仍然允许您四处移动并在文件中写入您想要/必要的地方.
Boost 序列化的简洁答案是
std::ofstream readFile("Categories.txt");
{
boost::archive::text_oarchive ar(readFile);
ar << vec;
ar << another_object;
ar << yet_another_object;
} // note destructs `ar`
readFile.close();
请注意,在关闭文件之前,您应该确保存档已完成。可悲的是,这是由 aarchive 析构函数处理的,因此您总是会遇到这种笨拙的生命周期舞蹈。
当然,文件在离开作用域时会自动关闭,因此您可以不使用 readFile.close()
。
在单个流中合并多个档案:
- Outputting more things than a Polymorphic Text Archive