2013-08-27 32 views
1

下面是一些C代碼:的printf在Linux上的Windows VS

int i; 
printf("This text is printed\nThis text is not until the for loop end."); 
for (i = 5; i > 0; i--) 
{ 
    printf("%d", i); 
    sleep(1); 
} 

爲什麼文本'\n'後剩下的不是for循環開始之前打印?即使是for循環中的printf也只在循環結束後才被打印出來。 如果我在文本的末尾加上'\n',它會打印出來,但我不想換行。

這隻發生在Linux上,而不是在Windows上(只是改變睡眠(1)睡眠(1000)並添加windows.h)。

+0

已回答:http://stackoverflow.com/questions/1716296/why-does-printf-not-flush-after-the-call-unless-a-newline-is-in-the-format-strin – dcaswell

+0

Windows和Linux有着非常不同的控制檯輸出驅動程序。在Linux中,輸出被緩衝,直到程序出現'\ n'。 – lurker

+0

爲什麼你認爲你不想在你的輸出結束時換行符?你(和許多其他Windows程序員)不會輸出它,但是它對於Unix程序員(例如我)來說似乎很奇怪 - 就像輸出一個換行符對Windows程序員來說看起來很奇怪,我猜。在Unix上,你會這樣做以確保輸出的產生 - 所以有一個合理的理由去做。在Windows上,據推測,默認模式對應於非緩衝,因此所有輸出在通話結束時生成。 –

回答

3

這是由輸出緩衝引起的。當您調用printf時,輸出不會立即打印。它被寫入一個緩衝區,以備將來輸出。通常一個\n字符會導致緩衝區自動刷新。您也可以手動刷新標準輸出緩衝區:

printf("This text is printed\nThis text is not until the for loop end."); 
fflush(stdout); 
1

查找setvbuf()_IONBF VS _IOLBF VS _IOFBF。默認情況下,當輸出到終端時,輸出是行緩衝的(_IOLBF)。這意味着輸出僅在包含換行符時纔會顯示。 _IONBF是非緩衝的,有時爲標準錯誤保留(儘管這也可以是行緩衝)。 _IOFBF是完全緩衝的;輸出不會出現,直到內部緩衝區已滿,或者您明確輸出(或者,有時,如果您從標準輸入讀取)。如果您寫入管道或文件,輸出通常會被完全緩衝。

一般而言,如果您想及時查看它們,您應該期望以換行符結束輸出 - 儘管如此,基於Windows的示例仍然相反。 (這是Stack Overflow上的一個常見模式,可合理可靠地識別何時爲Windows編寫程序。)

1

C標準沒有規定stdout的緩衝區。但POSIX暗示(不要求)通常stdout在連接到終端時是行緩衝的,否則是完全緩衝的。

Linux遵循此POSIX約定,但Windows不支持。您可以使用setvbuf更改默認行爲或使用fflush來刷新輸出,這由C標準保證。