I have a quite big object to serialize to disk, like this:
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;
}
The problem is, somtimes serialize
requires larger disk space than available. e.g. there is only 30M storage available but serialize
requires 200M. In this case I can normally open
the stream. During serialize
everything goes well, and close
returns nothing. The program runs well, but there is only a 30M file on the disk.
How can I get to know about this case?
What about this:
First of all,
serialize
should constantly verify whether its write operations succeed and throw should they fail.In the code you've presented you should check
OutEngineStream.fail()
(it covers more cases thanbad
) before callingclose
(becauseclose
may also set this state). This however will still leaveserialize
implemented incorrectly.The presented code checks for failure of opening the file.
In addition it should for failure of the write operation.
That's how to detect if the write operation failed.