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