为何std::ofstream指向的文件未被写入?调试场景疑问
C++文件流写入后文件未立即更新的原因
示例代码
#include <fstream> #include <iomanip> #include <iostream> #include <string> int main() { std::ofstream os("test.txt"); std::ifstream is("test.txt"); std::string value("0"); os << "Hello"; // clause 1 is >> value;// clause 2 std::cout << "Result before tie(): " << std::quoted(value) << "\n"; is.clear(); is.tie(&os); is >> value; std::cout << "Result after tie(): " << std::quoted(value) << "\n"; }
运行结果
Result before tie(): "0"
Result after tie(): "Hello"
问题
在clause 2处设置断点时,发现test.txt文件未被填充"Hello",请问这是为什么?
解答
这是因为C++标准库的文件流采用了缓冲机制:
- 执行
os << "Hello"时,字符串并没有直接写入磁盘上的test.txt,而是先暂存到输出流os的内存缓冲区里。 - 默认情况下,文件输出流是全缓冲模式,只有满足以下条件之一,缓冲区内容才会被刷新(写入磁盘):
- 缓冲区被填满
- 输出流对象被销毁(比如程序正常结束时)
- 显式调用
os.flush(),或者使用std::endl(输出换行的同时自动刷新缓冲区) - 与该输出流绑定的输入流执行操作(也就是代码中
is.tie(&os)之后的场景)
在clause 2处断点时,输出流的缓冲区还没触发刷新操作,所以磁盘上的test.txt里还看不到"Hello"。
内容的提问来源于stack exchange,提问作者yapkm01
相关产品推荐
相关产品推荐

