緩沖區(qū)問(wèn)題
假設(shè)有一段代碼為:
#include<iostream>
#include<unistd.h>
int main()
{
std::cout<<"it's a file for Proc"<<std::endl;
sleep(3);
return 0;
}
編譯后運(yùn)行為正常,先打印后等待三秒結(jié)束程序;
但若是將其中的換行endl刪除再次編譯運(yùn)行將會(huì)一樣嗎;
? 答案為否 為什么不是先打印后sleep而是先sleep后打印呢 這里存在一個(gè)緩沖區(qū)問(wèn)題
毋庸置疑的是,該處執(zhí)行的順序一定是先打印后sleep
? 在這里確實(shí)是先進(jìn)行打印而后再執(zhí)行sleep,但是這里執(zhí)行打印后并沒(méi)有將信息顯示出來(lái);
? 在c/C++中存在一個(gè)輸出緩沖區(qū)(c/C++所提供的一段內(nèi)存空間);
? 這個(gè)輸出緩沖區(qū)并并不是馬上進(jìn)行刷新,而是根據(jù)特定的刷新策略來(lái)進(jìn)行刷新;
對(duì)于一般的顯示器設(shè)備,一般的刷新策略即為遇到換行時(shí),就把換行前的所有字符全部進(jìn)行顯示
若是想直接進(jìn)行刷新則可以調(diào)用fflush(stdout);
進(jìn)行刷新;
? 從該處可以看出,在程序遇到fflush(stdout)時(shí)馬上進(jìn)行了刷新;
? 該函數(shù)即為立馬刷新輸出緩沖區(qū);
? 對(duì)于輸出緩沖區(qū)來(lái)說(shuō)一般是不會(huì)造成溢出的,當(dāng)輸出緩沖區(qū)到達(dá)一定的量時(shí)將會(huì)強(qiáng)制進(jìn)行刷新,并將新數(shù)據(jù)寫入進(jìn)輸出緩沖區(qū);
? 同時(shí),對(duì)于打印等函數(shù)來(lái)說(shuō)并不是直接將內(nèi)容直接打印到顯示器上,而是通過(guò)打印函數(shù)暫時(shí)存儲(chǔ)到了輸出緩沖區(qū)中;
回車與換行的區(qū)別
在c/C++中,尤其是在c語(yǔ)言中,大多數(shù)人習(xí)慣使用’\n’進(jìn)行換行;
但是其實(shí)來(lái)說(shuō),換行與回車是有區(qū)別的,對(duì)于換行來(lái)說(shuō),單換行并不能使光標(biāo)回到最開始的位置;
而對(duì)于回車來(lái)說(shuō),回車的真正意義為歸位,即將光標(biāo)恢復(fù)到最開始的位置;
然而在大部分場(chǎng)景中,鍵盤中的回車鍵都會(huì)被默認(rèn)為換行+回車;
即為換行后再將光標(biāo)恢復(fù)到首位;
在c/c++中也是如此,‘\n’將會(huì)默認(rèn)為 換行+回車 ,即’\n’ + ‘\r’ ;
從該處可以進(jìn)行一個(gè)實(shí)驗(yàn);
#include<iostream>
#include<unistd.h>
int main()
{
int count = 5;
while(count>=0){
std::cout<<"當(dāng)前剩余:"<<count<<std::endl;
sleep(1);
--count;
}
return 0;
}
運(yùn)行后:
每次都會(huì)打印數(shù)據(jù)并進(jìn)行換行回車,因?yàn)檫@里使用了endl,其功能與’\n’相同;
而若是將cout換成’\r’將會(huì)是什么情況?
當(dāng)講cout換成 ‘\r’ 時(shí)則什么都不會(huì)打印;
原因即為;
'\r’只是純回車,并不是換行,而緩沖區(qū)當(dāng)遇到換行時(shí)才會(huì)進(jìn)行刷新;
若是在此處加上fflush(stdout)將會(huì)進(jìn)行每次回車的功能;
這次并不會(huì)每次都進(jìn)行換行,而是每次進(jìn)行回車,同時(shí)內(nèi)容也將重新覆蓋,從而得到一個(gè)類似于倒計(jì)時(shí)的功能;
進(jìn)度條小程序
根據(jù)上述的所有內(nèi)容可以制作一個(gè)進(jìn)度條,即主要結(jié)合 ‘\r’ 回車來(lái)進(jìn)行操作;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-725416.html
#include<iostream>
#include<unistd.h>
#define NUM 51
int main()
{
char s[NUM];
int count = 0;
std::string C("|/-\\");
while(count < NUM){
printf("[%-50s][%-4d%%][%c]\r",s,count*2,C[count%4]);
fflush(stdout);
s[count++] = '=';
s[count+1] = '\0';
usleep(100000);
}
std::cout<<std::endl;
return 0;
}
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-725416.html
到了這里,關(guān)于『Linux小程序』進(jìn)度條的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!