开发者

Why does ofstream require a flush?

开发者 https://www.devze.com 2023-02-11 00:34 出处:网络
If I run the following code, no file is created at all: std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);

If I run the following code, no file is created at all:

std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
outputFile.write((const char*)lpResLock, dwSizeRes);
outputFile.close();

However, if I add a flu开发者_如何转开发sh() before the close, it works:

std::ofstream outputFile(strOutputLocation.c_str(), std::ios::binary);
outputFile.write((const char*)lpResLock, dwSizeRes);
outputFile.flush();
outputFile.close();

Does the standard library actually require this, or is it a bug in the Visual C++ CRT?


It's a bug. Reading §27.8.1.10/4, abridged:

void close();
Effects: Calls rdbuf()->close()...

What does rdbuf()->close() do? According to §27.8.1.3/6, abridged, emphasis mine:

basic_filebuf<charT,traits>* close();
If is_open() == false, returns a null pointer. If a put area exists, calls overflow(EOF) to flush characters. ...

That is, it's suppose to flush. (Indeed, the call to flush() ultimately does the same thing.)


Note the call to close() itself isn't needed, as the destructor of basic_ofstream will call close().


Are you checking the file before you exit from the program? OS will buffer all IO, so may not see any data(unless you flush) in the file before you exit.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号