c++ - 如果我打开一个已经在 C++ 中打开的文件会发生什么
问题描述
想象一下,我声明了一个输出文件。
如果我用这段代码打开它两次会发生什么?它还会起作用吗?
ofstream outfile;
outfile.open("record.txt", std::ofstream::app);
outfile.open("record.txt", std::ofstream::app);
解决方案
根据 上的文档std::ofstream::open
,它的行为方式与std::basic_filebuf::open
. 根据有关该功能的文档,如果文件已打开,则操作将失败。
这意味着第二次调用std::ofstream::open
将使流处于设置的状态failbit
。结果,流上的大多数后续操作将失败,直到该位被清除。为了清除该位,您必须调用std::ofstream::clear
. 之后,流将再次正常运行。
上面的答案适用于尝试使用同一个std::ofstream
对象打开两个文件,无论它是否是同一个文件。
尝试使用两个不同的std::ofstream
对象(您在问题中没有这样做)打开同一个文件是一个完全不同的问题。不建议这样做,因为即使操作系统允许多次打开一个文件,这也可能会为每个流对象提供自己的缓冲区,该缓冲区与其他流的缓冲区不同步。这可能会导致文件损坏。但是,如果两个流都访问文件中相距很远的完全不同的部分,它可能会起作用(但我仍然不建议冒险)。
推荐阅读
- angular - Angular + Clarity:图标未正确加载
- sql - 带有 WHERE AND 的 SQL SELECT QUERY 不起作用
- sql - Postgres 删除级联
- javascript - 如何在页面加载时运行 amp-script?
- scala - 如何在 Spark Scala 中使用 NLTK?
- python-3.x - 使用特定 Python 安装从命令行运行 Python 脚本
- spring-boot - 使用 @SqsListener 从不同的 AWS 账户读取消息
- javascript - 在 react native 中实现自定义标签栏
- java - 如何在excel文件中打印输出
- c++ - {fmt}:如果格式化字符串中不存在命名参数,它会被忽略吗?