進(jìn)度條 —— 第一個(gè)linux程序

windows系統(tǒng)下,我們通常認(rèn)為回車和換行是一個(gè)概念,但實(shí)際上,換行是指移動(dòng)到下一行的當(dāng)前位置,而回車則是回到當(dāng)前行的開頭。

我們之所以將回車和換行視為同一概念,是因?yàn)樵谑褂胣時(shí),它同時(shí)執(zhí)行了回車和換行的操作。

現(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; }

進(jìn)度條 —— 第一個(gè)linux程序

可以看到,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)樵贚inux中,程序執(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; }

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享