2014-06-10 35 views
2

我知道這是C++真:C中有阻塞物嗎?

  buffering output 

cerr: unbuffered stderr 
clog: buffered stderr 
cout: buffered stdout 

在C等價物cerrcout是:

cerr: fprintf(stderr, ...) 
cout: fprintf(stdout, ...) or printf(...) 

是否有clog等效?

+0

'cout'被緩衝,但請參閱「http://stackoverflow.com/questions/3723795/is-stdout-line-buffered-unbuffered-or-indeterminate-by-default」,因爲緩衝不起作用在C和C++中完全一樣。我不確定爲'stderr'添加一個緩衝區是個好主意,因爲在寫入實際錯誤時必須記住'flush',否則致命的錯誤不會消失。 – Potatoswatter

+0

@Potatoswatter謝謝,我改變了cout緩衝。我絕對不會使用clog來處理實際的錯誤,所以如果它沒有被刷新就不會有問題。 –

+0

這沒有意義。 C++'clog'和'cout'總是被緩衝,但問題是關於C'stderr'。如果您將其更改爲緩衝區,那麼您在C中沒有無緩衝的錯誤輸出工具。 – Potatoswatter

回答

1

不,C只有stderrstdout和標準輸出流。但是您可以按照setvbuf的要求設置stderr上的緩衝區。

2

是,使用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作爲 緩衝區的大小是個好主意。