以下程序是有效的 C 程序吗?
#include <stdio.h>
int main()
{
fwrite("x", 1, 1, stderr);
fflush(stderr);
fgetc(stderr);
fwrite("y", 1, 1, stderr);
return 0;
}
请注意,我尝试从标准错误中读取。
当我在 Visual C++ 2008 中编译并运行它时,我得到以下输出:
xy
这是有道理的。但是,当我将 stderr 重定向到一个文件 ( test.exe 2> foo.txt
) 时,我会看到一个“调试断言失败”窗口,并显示以下消息:“不一致的流计数。在连续读取和写入之间刷新”。fflush
在读取和写入之间添加 a确实可以解决问题。(这发生在调试版本中。在发布版本中,第二次写入静默失败)。
这种行为是否正确,或者这是编译器库错误?我在任何地方都找不到任何描述何时在 C 中读取或写入是非法的规则。