在windows系統(tǒng)下,我們通常認(rèn)為回車(chē)和換行是一個(gè)概念,但實(shí)際上,換行是指移動(dòng)到下一行的當(dāng)前位置,而回車(chē)則是回到當(dāng)前行的開(kāi)頭。
我們之所以將回車(chē)和換行視為同一概念,是因?yàn)樵谑褂胣時(shí),它同時(shí)執(zhí)行了回車(chē)和換行的操作。
現(xiàn)在讓我們看一下在Linux系統(tǒng)下以下兩段代碼的區(qū)別:
代碼語(yǔ)言:C 運(yùn)行次數(shù):0
#include<stdio.h> int main(){ printf("遲來(lái)的grownn"); return 0; }
代碼語(yǔ)言:C 運(yùn)行次數(shù):0
#include<stdio.h> int main(){ printf("遲來(lái)的grownr"); return 0; }
可以看到,n和r的效果不同,但使用r時(shí),輸出結(jié)果似乎沒(méi)有顯示。這是由于緩沖區(qū)的影響。
我們可以簡(jiǎn)單地理解為,輸入輸出操作并不是逐字符進(jìn)行的(某些特殊情況除外),而是使用行緩沖區(qū)。
在行緩沖模式下,只有遇到換行符時(shí)才會(huì)執(zhí)行真正的輸出。因此,使用r時(shí),輸出內(nèi)容會(huì)暫存在緩沖區(qū),直到程序結(jié)束時(shí)才會(huì)清空緩沖區(qū)。
代碼語(yǔ)言:C 運(yùn)行次數(shù):0
#include<stdio.h> int main(){ printf("遲來(lái)的grownn"); sleep(3); return 0; }
代碼語(yǔ)言:C 運(yùn)行次數(shù):0
int main(){ printf("遲來(lái)的grown"); sleep(3); return 0; }
運(yùn)行結(jié)果如下:
第一段代碼先輸出遲來(lái)的grown,然后休眠3秒; 第二段代碼休眠3秒后,在程序結(jié)束時(shí)才輸出遲來(lái)的grown。
這兩段代碼的區(qū)別在于是否使用了n,這也證明了行緩沖區(qū)的機(jī)制:遇到換行符時(shí)會(huì)刷新緩沖區(qū)內(nèi)容(程序結(jié)束時(shí)也會(huì)刷新緩沖區(qū)內(nèi)容)。
這是因?yàn)樵?a href="http://www.xiayu04.cn/help/index.php/tag/22">Linux中,程序執(zhí)行完畢后,光標(biāo)位于行首,命令行信息會(huì)覆蓋輸出內(nèi)容。
那么,我們能否通過(guò)一些操作來(lái)查看輸出內(nèi)容呢?
當(dāng)然可以,我們可以使用fflush來(lái)刷新緩沖區(qū)(stdout)的內(nèi)容。
代碼語(yǔ)言:C 運(yùn)行次數(shù):0
int main(){ printf("遲來(lái)的grown"); fflush(stdout); sleep(3); return 0; }