2014-03-13 37 views
3

以下程序顯示了緩衝I/O是如何導致程序出現問題的時候有點像錯誤「除以零」發生:是否將換行符添加到printf()等同於刷新流?

int main() 
{ 
    int a = 1, b = 0, c; 

    printf("Dividing..."); 
    c = a/b; 

    printf("Answer is: %d\n", c); 
    return 0; 
} 

輸出爲Floating point exception (core dumped)

不夠公平。但令人驚訝的是,如果我將第一個printf更改爲printf("Dividing...\n");,則在程序崩潰之前實際上會打印此文本(順便說一下,我在Linux上運行GCC)。

我可以得出結論:添加一個換行符相當於沖洗?如果是這樣,如果我的所有printf()字符串都以\n結尾,我實際上剝奪了自己對緩衝I/O的好處?

回答

4

如果您的標準輸出將發送到終端,那麼等於刷新,因爲printf()將使用基於行的緩衝。

如果它被重定向到一個文件,那麼沒有。在這種情況下,printf()使用更大的緩衝區(通常對應於文件系統塊大小或其他)來優化IO。

+0

令人驚異的答案,我必須說,一個驚人的啓示! :d – dotslash