準備工作:
一.關于緩沖區
首先,咱們先來一段有意思的代碼:
#include<stdio.h>
#include<unistd.h>
int main()
{printf("you can see me");sleep(5);}
你可以在你的本地運行一下,這里我告訴大家運行結果:這一段字符串等到程序運行結束后才被顯示出來。有些同學感覺非常震驚,但這就是運行結果。
我們都知道,這段代碼是順序運行結構,就是從前往后依次執行,毫無疑問,這段字符串肯定被優先執行,那么,為什么沒有被顯示出來?這5秒內,字符串在什么位置?
字符串一直在緩沖取內,等到運行結束時,才被刷新出來。那,怎么才能讓字符串在sleep前出現呢?
這里,我說明兩種方式:
方式一:
#include<stdio.h>
#include<unistd.h>
int main()
{printf("you can see me\n");sleep(5);}
在printf中加入換行符,因為\n默認的是行刷新,
#include<stdio.h>
#include<unistd.h>
int main()
{printf("you can see me\n");printf("you can see ");sleep(5);}
?我們來運行一下,會發現:第一字符串打印出來了,第二個字符串等到程序結束時,才顯示出來!
方式二:
#include<stdio.h>
#include<unistd.h>
int main()
{printf("you can see me\n");fflush(stdout)sleep(5);}
fflush(stdout)表示手動刷新緩沖區的操作。
二.\r,\n
\r是回車,\n是換行,所以\r\n 是回車換行,但是在語言層面,\n就代表著回車+換行。
?我們舉個栗子:
#include<stdio.h>
int main()
{printf("aaaaa\r");printf("11");return 0;
}
運行結果是:
果真像我們分析的那樣,程序運行完第一行,"aaaaa"被打印出來,然后光標回到行首,開始打印"11",這個位置原來的數據被后來的數據所覆蓋,所以打出來,就是這個樣子。
三.關于顯示屏
其實,不知道大家有沒有好奇過:我們的數字和字母都是怎么出現在顯示屏的呢?原理很簡單!!
在顯示屏看來,不過是字符還是數組還是漢字,都是由字符構成,比如在顯示屏上打印出1234,顯示屏就把1234看作4個字符,然后點亮這4個字符的光點,所以,我們就看見了1234。
四.制作一個一分鐘倒計時
#include<stdio.h>
#include<unistd.h>
int main()
{int num = 60;while (num){printf("%d\r", num);fflush(stdout);num--;}
}
二.制作一個進度條
效果演示:
寫在前面,這個進度條,我們準備分文件寫,分別為main.cc,process.cc,process.h,下面,將一一介紹各個文件的作用:
進度條代碼:
makefile:
myproc:process.cc main.cc gcc -o myproc process.cc main.cc //-o后邊的文件默認為生成的文件,其他的都是依賴文件
.PHONY:clean
clean:rm -f myproc
main.cc:
#include "process.h"int main()
{myprocess();}
代碼so easy!!
process.h:
#include<stdio.h>
#include<string.h>
#include<unistd.h>#define Num 101
#define STYLE '#'const char lable[]="|/-\\";
extern void myprocess();
process.cc:
#include "process.h"void myprocess()
{int cnt=0;char buf[Num];memset(buf,'\0',sizeof buf);//利用字符串初始化函數,初始化字符串為0;while(cnt<Num){if(cnt<Num-1)buf[cnt]=TAIL;printf("[%-100s][%-3d%%][%c]\r",buf,cnt,lable[cnt%4]);//[%-100s]:先留出100個字符的長度,保證從前往后顯示;%%:表示百分號buf[cnt++]=STYLE;fflush(stdout);usleep(50000);//usleep:和sleep效果相同,但usleep以微妙為單位,但sleep以秒為單位}printf("\n");
}
3、實現過程分析
?
進度條樣式 :
主體樣式為兩個中括號包裹,中間 => 推進的方式呈現,比如:[======>]
主體右側中括號位置保持不變,中間元素不斷推進,比如:[=> ]
因此我們把中間主體 = 宏定義為 STYLE,把尾側 > 宏定義為 TAIL
進度條百分比:
顯示當前加載進度,用 [rate%] 顯示,rate 隨著進度條的不斷推進而變化,而打印 %(轉義字符)則需要兩個 %%
進度條旋轉字符:
顯示加載樣式,可以利用一個旋轉的字符,例如 [] 的樣式,順時針不斷旋轉,依次為 “| / - \”,注意 \ 也是轉義字符,因此需要兩個 \ \,對此我們定義一個lable指針指向常量字符串const char *lable=" | / - \ "