c++ - 为什么 ofstream 需要冲洗?

标签 c++ file stream standard-library

如果我运行以下代码,根本不会创建任何文件:

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

但是,如果我在关闭前添加一个 flush(),它会起作用:

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

标准库是否真的需要这个,或者它是 Visual C++ CRT 中的错误?

最佳答案

这是一个错误。阅读 §27.8.1.10/4,删节:

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

什么是rdbuf()->close()做?根据 §27.8.1.3/6,删节,强调我的:

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

也就是说,它应该冲洗。 (实际上,调用 flush() 最终会做同样的事情。)


请注意对 close() 的调用本身不需要,因为 basic_ofstream 的析构函数会调用close() .

关于c++ - 为什么 ofstream 需要冲洗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036878/

相关文章:

c++ - 不同的普通可复制类型之间的 std::memcpy 是未定义的行为吗?

c# - 如何将 %programfiles%\directory\tool.exe 形式的字符串转换为 C#/.net 中可用的文件名?

java - io异常 : a required privilege is not held by client while writing in file in java

http - Elixir:使用流 API 的 HTTPResponseStream

java - 如何预先设置流立即刷新

javascript - 解析 JSON 流

c++ - 生成组合的动态迭代规划

C++:如何从 cin 中删除错误的输入?

c++ - gcc/g++ 与 icc

c++ - C++中的文件删除