0

C++ 程序 P1 使用 ios::app 在不存在的文件上创建 ofstream。然后它会写入一些字符串(其中没有“\n”)但不使用 endl(因此缓冲区不会被刷新)。然后等待 2 秒并关闭文件。

程序 P2 与 P1 相同,只是它没有等待。我期待 P1 覆盖 P2 在文件中写入的任何内容,因为它的缓冲区在 2 秒后被刷新,但事实并非如此。P2 的输出正确显示,然后是文件中 P1 的输出。

经过多次这样的实验,在我看来,“app”模式在每次写入后都会刷新缓冲区(即使未使用 endl)。我想知道其他人是否遇到过类似的情况,以及我的结论是否正确。先谢谢了。

4

2 回答 2

0

您在这里依赖未定义的行为 - 如果您不使用 std::endl,没有任何保证它不会刷新。不要依赖未定义或假定的行为——只依赖明确指定的行为。

详细说明:

1.3.24                                                                                    [defns.undefined]
undefined behavior
behavior for which this International Standard imposes no requirements
[ Note: Undefined behavior may be expected when this International Standard omits any explicit definition of
behavior or when a program uses an erroneous construct or erroneous data. Permissible undefined behavior
ranges from ignoring the situation completely with unpredictable results, to behaving during translation or
program execution in a documented manner characteristic of the environment (with or without the issuance of
a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).
Many erroneous program constructs do not engender undefined behavior; they are required to be diagnosed.
— end note ]

c++11 或 c++03 对 user2585330 所依赖的行为没有任何要求。

于 2013-07-15T23:38:52.530 回答
0

简短的回答:不,你不能依靠这种行为来工作。

在不久前的一个类似问题中,我写了一些代码,它确实做到了这一点,它确实不起作用(不一定是进程会覆盖彼此的数据——我没有看到那种特殊的行为,但那不是我的样子寻找——在这种情况下的问题是,是否保证数据从一个过程和另一个过程“完整”——这显然也是你的担忧之一,即使你没有问过这个问题)。您将获得来自一个进程的“块”数据与来自另一个进程的“块”数据混合。它们究竟如何混合在一起取决于什么平台、系统上的负载、一周中的哪一天(相关性模糊,可能不是真的),以及可能的其他十几个因素。

从技术上讲,C++ 标准不知道/关心多个进程,就语言而言,只有一个进程 - 想象一下该语言在旧的 DOS 系统上运行,其中任何时候都只有一个进程在运行给定的时间。因此,该标准没有说明如果您有多个进程使用同一个文件会发生什么。

于 2013-07-16T00:07:06.133 回答