以下程序是否爲有效的C程序?C標準庫轉角箱
#include <stdio.h>
int main()
{
fwrite("x", 1, 1, stderr);
fflush(stderr);
fgetc(stderr);
fwrite("y", 1, 1, stderr);
return 0;
}
請注意,我嘗試從stderr讀取。
當我編譯它在Visual C++ 2008,並運行它,我得到以下的輸出:
xy
這是有道理的。但是,當我將stderr重定向到一個文件(test.exe 2> foo.txt
)時,我得到一個 「Debug Assertion Failed」窗口,並顯示消息:「流連續數不一致,在連續讀取和寫入之間刷新」。在讀取和寫入之間添加fflush
確實解決了問題。 (這發生在調試版本中,在發佈版本中,第二次寫入會靜默失敗)。
這種行爲是否正確,或者這是一個
編譯器
庫錯誤?讀取或寫入的C.是非法的,當我找不到任何地方的任何描述規則
從輸出流中讀取是未定義的行爲。你究竟期望它做什麼? – 2010-07-08 18:50:56
請注意,它不會是一個編譯器錯誤,而是一個庫實現錯誤。 – 2010-07-08 18:52:35
@NeilButterworth - 我不相信讀輸出流應該會導致UB。根據Opengroup的說法,這隻會導致'fgetc'失敗並將errno設置爲'EBADF'(請參閱http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html) – 2010-07-08 18:53:58