在進(jìn)行進(jìn)度條的程序的編寫之前,還有幾個(gè)問題需要解決。
第一個(gè)問題,先來看兩段代碼:
對(duì)比上面兩段代碼只有一個(gè)\n
的區(qū)別。
左邊的代碼很簡(jiǎn)單,就是先打印,然后停頓 3 秒,程序退出。
主要問題是,右邊的代碼,也實(shí)先打印,然后停頓 3 秒,程序退出嗎?
答案顯然不是。真實(shí)看到的運(yùn)行結(jié)果是,程序先停頓了 3 秒,然后打印輸出完之后,程序直接退出。
至于為什么,當(dāng)然是緩沖區(qū)的問題了。
根據(jù)程序從上到下順序執(zhí)行的規(guī)則,其實(shí)printf
語句是比sleep
先執(zhí)行的,只是信息沒有被立即打印出來罷了。
沒有被及時(shí)打印出來的信息被送入緩沖區(qū),而顯示器設(shè)備的刷新策略一般都采用的是行刷新(碰到換行符刷新),所以信息就被“逗留”在了緩沖區(qū)。然后程序停頓 3 秒,退出程序的時(shí)候緩沖區(qū)的信息又被刷新到屏幕上。就好像出現(xiàn)了程序并沒有按順序執(zhí)行的情況。
這里可以用fflush
這個(gè)函數(shù)進(jìn)行驗(yàn)證。fflush
可以將文件緩沖區(qū)進(jìn)行刷新。
第二個(gè)問題,什么是換行?什么是回車?
換行就是換到當(dāng)前位置的下一行,回車就是回到當(dāng)前行的起始位置。
程序中,\n
表示換行,\r
表示回車。
但是程序中的換行\n
通常都做了特殊處理,好像是換行和回車的結(jié)合體。
最后進(jìn)入進(jìn)度條程序的編寫(Vim)。文章來源:http://www.zghlxwxcb.cn/news/detail-517299.html
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define NUM 52
int main()
{
char bar[NUM] = {0};
int count = 1;
const char* lable = "|/-\\";
while(count <= 101)
{
printf("[%-50s][%d%%]%c\r", bar, count - 1, lable[count%4]);
fflush(stdout); // 刷新
if(1 == count % 2)
{
bar[(count + 1) / 2 - 1] = '-';
}
else
{
bar[(count + 1) / 2 - 1] = '=';
}
++count;
usleep(100000); // 停頓間隔為 0.1 秒
}
printf("\n");
return 0;
}
運(yùn)行完成結(jié)果:文章來源地址http://www.zghlxwxcb.cn/news/detail-517299.html
到了這里,關(guān)于【LInux】簡(jiǎn)單進(jìn)度條程序的編寫的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!