【发布时间】:2020-01-04 08:34:17
【问题描述】:
这个recently asked question 提出了另一个有趣的问题,正如comments to one of its answers 中所讨论的那样。
总结一下:当随后尝试“同时”从两个流读取/向两个流写入数据时,OP 存在如下代码问题:
ifstream infile;
infile.open("accounts.txt");
ofstream outfile;
outfile.open("accounts.txt");
虽然问题本身已成功解决,但它提出了一个我无法找到权威答案的问题(我已经对 Stack Overflow 和更广泛的网络进行了一些相当广泛的搜索)。
非常清楚地说明了在调用已经与 文件 (cppreference) 关联的 流 的 open() 方法时会发生什么,但我当file 已经与(不同的)stream 相关联时(在本例中)会发生什么,无法找到答案。
如果流已经与文件相关联(即,它已经 open),调用该函数失败。
我可以在这里看到几种可能的情况:
- 第二次打开的调用将失败,任何尝试写入它的操作也将失败(但在引用的问题中不是)。
- 第二个打开的调用将“覆盖”第一个,有效地关闭它(这可以解释上述代码中遇到的问题)。
- 两个流都保持打开状态,但进入关于其内部文件指针和缓冲区的“相互破坏”匹配。
- 我们进入了未定义(或实现定义)行为的领域。
请注意,由于第一个 open() 调用是由输入流进行的,因此操作系统不一定会像对输出流那样“锁定”文件。 p>
那么,有人对此有明确的答案吗?或者来自标准的引用(如果找不到更权威的,cppreference 将是“可接受的”)?
【问题讨论】:
-
“cppreference 就足够了”?根据我的经验,这种情况很少见。标准中的微妙细节通常在该网站上找不到。
-
@paxdiablo 说得好 - 请参阅(次要)编辑!
-
有趣的是,打开的流包含文本“好像通过调用
fopen”,因此请遵循相关的 C 标准。不确定这有多大帮助,因为粗略地看一眼 C11 也没有表明如果您使用两个不同的FILE*变量打开同一个文件应该发生什么定义的行为:-) -
C 标准中什么也没说。在 posix 兼容的操作系统 (Linux) 上,您不会有任何问题,
fopen将调用open系统调用,这将为每个流创建一个open file description。一切都会按预期进行。 -
嗯,它应该按照常识工作。首先,打开模式应该是适当的(非独占,不截断),然后不能处理文件的公共部分。例如,如果
outfile在末尾附加内容,infile读取预先存在的内容,它应该可以正常工作。但是,很难预测何时读取会到达文件末尾...
标签: c++ fstream undefined-behavior