Linux和Windows下使用printf的差别
【1.Linux系統下】
一般而言,大家都知道printf是帶有行緩沖的函數,printf把打印的消息先輸出到行緩沖區,在以下幾種情況下:1.程序結束時調用exit(0)/return;2.遇到回車\n,3.調用fflush函數;4.緩沖區滿。會自動刷新緩沖區,緩沖區的內容顯示到標準輸出上。
比如在LINUX系統下,執行如下程序:
使用GCC編譯后執行,發現shell中并沒有輸出hello,這是因為LINUX系統下,printf把“hello”輸出到緩沖區,而此時沒有發生緩沖區刷新的4種情況,因此shell中并不會看到hello。但是如果使用printf("hello\n");或者在printf后使用fflush(stdout);那么執行時在shell中就會看到hello輸出。
【2.WINDOWS系統下】
同樣這段程序,如果在Windows下編譯運行(使用VC++6.0),會發現控制臺中馬上看到hello的輸出。分析原因發現,Windows下stdout沒有提供緩沖(不知道這個原因是否確切)。比如執行如下程序:
?
可以看到stdout的緩沖區大小為0,這也就意味著,stdout是沒有緩沖區的,因此printf輸出到stdout,不存在緩沖,這個和LINUX系統中對printf處理的機制是不一樣的。
在Windows下,可以使用setbuf函數(https://msdn.microsoft.com/en-us/library/86cebhfs.aspx)來設置緩沖區的方式和大小。
?
使用setbuf函數,把stdout設置為行緩沖,大小為512字節。在VC++6.0中運行該程序,發現不會在控制臺中輸出hello,如果把緩沖區設置為2個字節大小:setvbuf(stdout, buf, _IOLBF, 2);此時程序的輸出為hell,he輸出到緩沖區,緩沖區滿,刷新緩沖區,控制臺看到he,ll輸出到緩沖區,緩沖區滿,再次刷新,控制臺看到ll,o輸出到緩沖區,此時緩沖區未滿,因此看不到o在控制臺輸出。
使用如下程序,查看緩沖區的大小,輸出結果為512字節
此外,在Windows設置緩沖區的情況下,printf中使用回車符\n是不會刷新緩沖區的。對上述程序,把fflush函數注釋掉,在VC++6.0中重新執行,控制臺中看不到輸出。
總結
以上是生活随笔為你收集整理的Linux和Windows下使用printf的差别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows下cmd命令提示符下让程序
- 下一篇: Linux下内存泄露工具