我知道這是C++真:C中有阻塞物嗎?
buffering output
cerr: unbuffered stderr
clog: buffered stderr
cout: buffered stdout
在C等價物cerr
和cout
是:
cerr: fprintf(stderr, ...)
cout: fprintf(stdout, ...) or printf(...)
是否有clog
等效?
我知道這是C++真:C中有阻塞物嗎?
buffering output
cerr: unbuffered stderr
clog: buffered stderr
cout: buffered stdout
在C等價物cerr
和cout
是:
cerr: fprintf(stderr, ...)
cout: fprintf(stdout, ...) or printf(...)
是否有clog
等效?
不,C只有stderr
和stdout
和標準輸出流。但是您可以按照setvbuf
的要求設置stderr
上的緩衝區。
是,使用setvbuf
和充分緩衝(_IOFBF
):
全緩衝:在輸出時,一旦緩衝器滿(或 沖洗)的數據被寫入。在輸入時,當輸入操作是 請求且緩衝區爲空時,填充緩衝區。
#include <stdio.h>
int main(void)
{
char buff[BUFSIZ];
setvbuf(stderr, buff, _IOFBF, BUFSIZ);
fprintf(stderr, "Hello world\n");
getchar();
fflush(stderr);
return 0;
}
BUFSIZ的值被選擇的每個系統上,以便使流I/O 高效。因此,在調用setvbuf時,使用BUFSIZ作爲 緩衝區的大小是個好主意。
'cout'被緩衝,但請參閱「http://stackoverflow.com/questions/3723795/is-stdout-line-buffered-unbuffered-or-indeterminate-by-default」,因爲緩衝不起作用在C和C++中完全一樣。我不確定爲'stderr'添加一個緩衝區是個好主意,因爲在寫入實際錯誤時必須記住'flush',否則致命的錯誤不會消失。 – Potatoswatter
@Potatoswatter謝謝,我改變了cout緩衝。我絕對不會使用clog來處理實際的錯誤,所以如果它沒有被刷新就不會有問題。 –
這沒有意義。 C++'clog'和'cout'總是被緩衝,但問題是關於C'stderr'。如果您將其更改爲緩衝區,那麼您在C中沒有無緩衝的錯誤輸出工具。 – Potatoswatter