chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

教你在Linux上寫一個進度條小程序

dyquk4xk2p3d ? 來源:入門小站 ? 2023-01-29 11:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一、前言

Linux 上寫下一個簡易的進度條小程序。

成品展示

93c0b498-96c4-11ed-bfe3-dac502259ad0.gif

今天的內(nèi)容比較輕松,只需要了解兩個知識點,這個小程序就很容易寫出來了,讓我們開始今天的學習。

二、理解 ‘ ’ 與 ‘ ’

C 語言中有很多字符,而字符大體分為兩類:可顯字符、控制字符。

控制字符不可顯示,例如 和 就是控制字符。

而在我們平時打字時,一行寫滿了需要換行,但是新起一行有很多種,例如:

93cdda7e-96c4-11ed-bfe3-dac502259ad0.png

這樣雖然新起一行了,但是不是我們想要的結(jié)果。

我們通常新起一行是在第二行的最左端,但是對于這個結(jié)果其實有兩個操作:

1.跳轉(zhuǎn)到第二行

2.回到第二行的最左端

有了這個基本概念,再來談 和 的作用:

:回車 - 回到文本行的開頭

:換行 - 新起一行

所以,其實我們平時泛指的換行實際上是 回車 + 換行。

且在語言范疇下,例如 C 語言,換行就可以達到回車 + 換行的效果。在平常,這一操作還是兩個步驟。

三、行緩沖

行緩沖這個概念認識。

1、提出問題

首先先了解一下兩個庫函數(shù):

sleep:Linux 下的休眠函數(shù),單位是秒。頭文件為#include

fflush:刷新緩沖區(qū)

代碼 1:

#include
intmain()
{
printf("helloxxx");
sleep(3);
return0;
}

現(xiàn)象:

93e6f360-96c4-11ed-bfe3-dac502259ad0.gif

分析:

光標停留在文本行的開頭,但是字符串沒有被打印。

反而像是 sleep 函數(shù)先起作用,然后 printf 函數(shù)再從光標處開始打印。

打印完之后,shell 提示符緊跟著字符串后顯示。

代碼 2:

#include
intmain()
{
printf("helloxxx
");
sleep(3);
return0;
}

現(xiàn)象:

93f45a50-96c4-11ed-bfe3-dac502259ad0.gif

分析:

printf 打印的字符串先顯示在終端上,光標位于字符串的下一行。

sleep 函數(shù)使程序休眠 3 秒后,shell 提示符從光標位置開始顯示。

代碼 3:

#include
intmain()
{
printf("helloxxx
");
sleep(3);
return0;
}

現(xiàn)象:

93fc5f3e-96c4-11ed-bfe3-dac502259ad0.gif

分析:

printf 打印的字符串沒有顯示到終端,光標一直停留在該打印字符串的一行

sleep 函數(shù)休眠三秒后,shell 提示符直接打印在了屏幕上。并沒有看到字符串。

觀察上面的現(xiàn)象,我們提出幾個問題:

代碼 1 好像是先執(zhí)行了 sleep ,在執(zhí)行 printf ,是這樣嗎?

代碼 2 加上了 ‘ ’ ,字符串一開始就顯示了,為什么?

代碼 3 好像什么都沒打印,這是為什么?

在解答這些問題之后,我們先了解一下行緩沖。

2、認識行緩沖

在內(nèi)存中預留了一塊空間,用來緩沖輸入或輸出的數(shù)據(jù),這個保留的空間被稱為緩沖區(qū)。

我們之前或多或少都聽說過緩沖區(qū)。

在代碼 1 中,由于程序是按照數(shù)據(jù)執(zhí)行的,所以必定是先執(zhí)行 printf 。

但是數(shù)據(jù)沒有顯示,所以這時候,數(shù)據(jù)就一定被保存在某個位置,保存的位置就是緩沖區(qū)。

而要讓數(shù)據(jù)顯示,是需要刷新緩沖區(qū)的。

行緩沖是緩沖區(qū)刷新策略的一種,在行緩沖模式下,當輸入和輸出中遇到 ‘ ’ 換行時,就會刷新緩沖區(qū)

有了這個概念,我們繼續(xù)分析問題。

3、解答與拓展

解答

問題 1:代碼 1 好像是先執(zhí)行了 sleep ,在執(zhí)行 printf ,是這樣嗎?

當然不是。由于程序是按照順序執(zhí)行的,所以必定是先執(zhí)行完 printf 在執(zhí)行 sleep 。

而數(shù)據(jù)沒有被顯示出來的原因是:數(shù)據(jù)保存在緩沖區(qū)中,但是沒有主動刷新,當程序退出后,保存在緩沖區(qū)中的數(shù)據(jù)被自動刷新出來了。

所以才會造成這種現(xiàn)象。

問題 2:代碼 2 加上了 ,字符串一開始就顯示了,為什么?

這里由于是直接往顯示器上打印,所以采用的刷新方式為行緩沖。

所以執(zhí)行碰到 ‘ ’ 時,就會把在緩沖區(qū)中的 (換行符之前) 的內(nèi)容全部刷新出來。

所以這段代碼一開始就會有數(shù)據(jù)顯示,然后再 sleep 休眠。

問題 3:代碼 3 好像什么都沒打印,這是為什么?

之前說過 是換行,所以當 printf 遇到 時,就把光標移到開頭。sleep 睡眠后,當程序退出,shell 打印提示符時,就覆蓋了字符串。

拓展

數(shù)據(jù)真的是臨時保留在緩沖區(qū)里的嗎?光標如何理解?

我們用一段代碼來理解這兩個問題:

#include
#include
intmain()
{
printf("helloxxx
");
fflush(stdout);
sleep(3);
return0;
}

現(xiàn)象:

94037e36-96c4-11ed-bfe3-dac502259ad0.gif

觀察現(xiàn)象,我們發(fā)現(xiàn)當我們使用fflush主動刷新緩沖區(qū)后,數(shù)據(jù)就顯示在了屏幕上;且因為 ‘ ’ 的原因,光標指向字符串開頭;當打印 shell 提示符時,就直接從光標位置開始覆蓋。

所以對于這兩個問題,我們已經(jīng)得到了答案:

1.數(shù)據(jù)被臨時保存在于緩沖區(qū)中,通過刷新就可以顯示

2.數(shù)據(jù)是從光標位置開始打印的。

一句話理解光標:光標和顯示器匹配,光標在哪里,顯示器打印的時候就從哪里開始打印。

4、倒計時

基于對上面的理解,我們先實現(xiàn)一個簡單的倒計時。

倒計時就是在屏幕上不斷顯示數(shù)字,每次在同一位置顯示,并將之前的數(shù)據(jù)覆蓋。

既然是每次要從頭開始覆蓋,那么就可以用 ‘ ’ 來實現(xiàn)每次回到行首,并且可以通過相應的格式化控制顯示多位打印。

但是 ‘ ’ 不會主動刷新,所以要用fflush函數(shù)主動刷新緩沖區(qū)。

在每次刷新之后,使用 sleep 函數(shù),間隔一定的時間。

由此,我們可以很輕松寫出代碼,例如寫一個從 10 開始的倒計時:

#include
#include

intmain()
{
inti=10;
for(;i>=0;i--){
//位寬控制,
回到開頭
printf("%2d
",i);
fflush(stdout);//主動刷新
sleep(1);//休眠
}
printf("
");//換行,打印提示符
return0;
}
94115808-96c4-11ed-bfe3-dac502259ad0.gif

四、進度條

好了,接下來進入正題,我們開始寫進度條。

進度條樣式

主體樣式為兩個中括號包裹,中間=>推進的方式呈現(xiàn),比如:[======>]

主體右側(cè)中括號位置保持不變,中間元素不斷推進,比如:[=> ]

顯示當前加載進度,用[num%]顯示,num 隨著進度條的不斷推進而變化

顯示加載樣式,可以利用一個旋轉(zhuǎn)的字符,例如[]的樣式,順時針不斷旋轉(zhuǎn)

大約呈現(xiàn)狀態(tài)為:[========>] [15%] []

采用多文件

文件存放在proc目錄中

proc.h :函數(shù)聲明

proc.c :進度條邏輯

main.c :函數(shù)調(diào)用

makefile準備

由于采用多文件,所以依賴關(guān)系可以寫成依賴文件列表的樣式:

941a4648-96c4-11ed-bfe3-dac502259ad0.png

分塊邏輯

1.進度條主體

預留進度條大小為 100 個=,外加 1 個>,加上保存'?'的位置,用數(shù)組存儲為 102 個單位。

進度條是一行中的,所以需要用到' ',每次都需要使用fllush主動刷新緩沖區(qū)。

每次刷新出數(shù)據(jù)之后,將 = 填充到數(shù)組中,并且顯示 > 。在最后一次顯示時,控制 > 不要顯示。

然后休眠一小會。由于休眠用 sleep 函數(shù)太慢。所以可以用 usleep 函數(shù)休眠,usleep 函數(shù)的參數(shù)單位是微秒。

根據(jù)這個寫出代碼:

942199a2-96c4-11ed-bfe3-dac502259ad0.png942b83a4-96c4-11ed-bfe3-dac502259ad0.gif

2.百分比顯示

%% 顯示為一個 % ,而 %d 為數(shù)字,這步很簡單,只要在 printf 語句中加上內(nèi)容:

printf("[%-100s][%d%%]
",bar,i);

3.旋轉(zhuǎn)光標

光標旋轉(zhuǎn)方向為順時針旋轉(zhuǎn),那么旋轉(zhuǎn)時就可以用數(shù)組保存。

旋轉(zhuǎn)每次顯示內(nèi)容分別為| / - ,\代表一個 ,因為和 結(jié)合的會被解析為轉(zhuǎn)義字符,將其保存到字符串中。

而由于字符串一共就四個字符,所以輸出的時候需要控制輸出位置。

代碼:

constchar*str="|/-";//字符串
printf("[%-100s][%d%%][%c]
",bar,i,str[i%4]);//輸出語句

完整代碼

proc.h

#pragmaonce

#include

externvoidprocess();

proc.c

#include"proc.h"
#include
#include

#defineSIZE102//數(shù)組大小
#defineSTYLE'='
#defineFLAG'>'

voidprocess()
{
constchar*str="|/-";
charbar[SIZE];
memset(bar,'?',sizeof(bar));
inti=0;
while(i<=?100)?{
??????printf("[%-100s][%d%%][%c]
",?bar,?i,?str[i?%?4]);?//?格式控制
??????fflush(stdout);?//?刷新
??????bar[i++]?=?STYLE;?//?填充數(shù)據(jù)
??????if?(i?!=?100)?{
??????????bar[i]?=?FLAG;?//?如果不是最后一次則顯示?>
}
usleep(100000);//休眠
}
printf("
");
}

test.c

#include"proc.h"

intmain()
{
process();
return0;
}

進度條展示

93c0b498-96c4-11ed-bfe3-dac502259ad0.gif

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Linux
    +關(guān)注

    關(guān)注

    88

    文章

    11761

    瀏覽量

    219071
  • C語言
    +關(guān)注

    關(guān)注

    183

    文章

    7644

    瀏覽量

    145634
  • 字符
    +關(guān)注

    關(guān)注

    0

    文章

    237

    瀏覽量

    26211
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4417

    瀏覽量

    67532
  • 小程序
    +關(guān)注

    關(guān)注

    1

    文章

    243

    瀏覽量

    13415

原文標題:教你在 Linux 上寫一個進度條小程序

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何在程序中加進度條顯示程序運行的進度

    由于數(shù)據(jù)很大,程序運行的時間很長,想在程序中加進度條顯示程序運行的
    發(fā)表于 08-14 22:30

    如何為運行得很慢的程序添加進度條或者任何提示?

    問題是:該程序的循環(huán)底層VI中,該VI用戶不可更改。較頂層的程序均不存在循環(huán)。為了排解等待程序運行過程中的無聊,想加個進度條,或者任何會動
    發(fā)表于 09-26 16:59

    請問怎么用進度條顯示程序進度

    怎么用進度條顯示程序進度
    發(fā)表于 12-24 10:02

    如何顯示vi程序運行的進度條

    程序調(diào)用mtalab腳本節(jié)點,運行很慢,想設(shè)計進度條,實時顯示運行進度,求各位大神幫忙
    發(fā)表于 04-01 13:53

    labview的進度條

    這是labview的進度條程序,比較好用
    發(fā)表于 08-04 14:30

    labview進度條

    我用labview2017做了文件解壓和復制的vi,解壓過程中不知道真實的解壓進度,怎么才能做一個真實的進度條,要真是的,不是自己規(guī)定的
    發(fā)表于 04-26 09:10

    為什么燒不了程序,進度條直不動?

    怎么燒不了程序...進度條直不動啊...
    發(fā)表于 07-18 05:45

    怎么設(shè)置進度條?

    RT!比如 我創(chuàng)建隨意長度的進度條然后我知道文件的大小 當把這個文件里的數(shù)據(jù)讀完后進度條
    發(fā)表于 08-22 04:35

    如果更新太快,進度條對象無法正確呈現(xiàn)?

    嗨,所有,我正在更新和諧進度條對象的基礎(chǔ)定時器值。如果我使用的時間小于1500毫秒,進度條對象背景和邊框不能正確渲染。這段視頻更清楚地
    發(fā)表于 09-20 06:18

    HarmonyOS實戰(zhàn)——ProgressBar進度條組件基本使用

    ProgressBar案例——點擊進度條增加實際進度值需求分析:每單擊進度條組件時,進度條就加 5% 的
    發(fā)表于 09-22 23:31

    Linux下實現(xiàn)進度條程序,通過makefile進行編譯

    1. Linux下實現(xiàn)進度條程序。 通過makefile進行編譯。 建議自主完成彩色的
    發(fā)表于 03-12 16:31 ?8200次閱讀

    Linux基礎(chǔ)教程之linux wget下載進度條變成多行顯示如何解決

    之前為了 解決Putty客戶端連接到CentOS之后顯示亂碼 的問題,設(shè)置了 LANG=zh_CN.UTF-8 之后,使用wget下載的時候,wget下載進度條異常,竟然不能在
    發(fā)表于 10-31 17:04 ?19次下載

    如何利用ChatGPT快速實現(xiàn)控制臺進度條小工具?

    控制臺程序執(zhí)行些耗時任務(wù)時,需要向用戶顯示當前任務(wù)執(zhí)行的進度,以提供清晰的感知。比如下載程序
    的頭像 發(fā)表于 01-18 13:41 ?2425次閱讀
    如何利用ChatGPT快速實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b>控制臺<b class='flag-5'>進度條</b>小工具?

    【AWTK使用經(jīng)驗】如何設(shè)計立體電池進度條?

    AWTK是基于C語言開發(fā)的跨平臺GUI框架?!禔WTK使用經(jīng)驗》系列文章將介紹開發(fā)AWTK過程中些常見問題與解決方案,例如:如何加載外部資源?如何設(shè)計自定義進度條?這些都會在系列文章進行解答
    的頭像 發(fā)表于 04-18 08:25 ?1313次閱讀
    【AWTK使用經(jīng)驗】如何設(shè)計立體電池<b class='flag-5'>進度條</b>?

    【HarmonyOS 5】鴻蒙中進度條的使用詳解

    【HarmonyOS 5】鴻蒙中進度條的使用詳解 ##鴻蒙開發(fā)能力 ##HarmonyOS SDK應用服務(wù)##鴻蒙金融類應用 (金融理財# 、HarmonyOS中Progress進度條的類型
    的頭像 發(fā)表于 07-11 18:26 ?1147次閱讀
    【HarmonyOS 5】鴻蒙中<b class='flag-5'>進度條</b>的使用詳解