我有一个非常大的对象要序列化到磁盘,如下所示:
if (!EngineFile.empty())
{
std::ofstream OutEngineStream(EngineFile);
if (!OutEngineStream)
{
std::cerr << "Failed to write to file \"" << EngineFile << "\"! Aborting ..." << std::endl;
return -1;
}
engine->serialize(OutEngineStream);
OutEngineStream.close();
std::cout << "\"" << EngineFile << "\" successfully wrote to disk." << std::endl;
}
问题是,somtimes serialize
需要比可用磁盘空间更大的磁盘空间。例如只有30M存储空间可用,但serialize
需要200M存储空间。在这种情况下,我通常可以open
流。 serialize
期间一切顺利,close
不返回任何内容。该程序运行良好,但磁盘上只有一个30M的文件。
我怎样才能了解这个案子?
答案 0 :(得分:1)
显示的代码检查打开文件失败。
此外,它应该是写操作失败。
如何检测写操作是否失败。
答案 1 :(得分:1)
这个怎么样:
std::fstream file;
file.exceptions( std::fstream::failbit | std::fstream::badbit );
try {
// do work
}
catch (std::fstream::failure e) {
std::cerr << "Exception opening/reading/writing/closing file\n";
}
答案 2 :(得分:1)
首先,serialize
应该不断验证其写操作是否成功,如果失败则抛出。{/ p>
在您提供的代码中,您应该在致电bad
之前检查OutEngineStream.fail()
(它涵盖的案件多于close
)(因为close
也可能设置此项州)。但是,这仍然会导致serialize
执行不正确。