玩轉Linux進度條

準備工作:

一.關于緩沖區

首先,咱們先來一段有意思的代碼:

#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=" | / - \ "

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/21649.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/21649.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/21649.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SAP HANA 33】前端參數多選情況下HANA如何使用in來匹配?

場面描述: 在操作界面經常會出現某個文本框需要多選的情況,然后后臺需要根據多選的值進行匹配搜索。 一般處理的情況是: 1、在Java后端動態生成SQL 2、不改變動態SQL的情況,直接當做一個正常的參數進行傳遞 本次方案是第二個,直接當做一個正常的字符串參數進行傳遞即…

【面試題-014】Mysql數據庫有哪些索引類型?

文章目錄 B 樹和 B 樹區別B 樹B 樹 mysql聚簇索引和非聚簇索引聚簇索引&#xff08;Clustered Index&#xff09;非聚簇索引&#xff08;Non-Clustered Index&#xff09;總結 MyISAM和InnoDB兩種常見的存儲引擎區別MySQL的主從同步原理如何確保主從同步的數據一致性&#xff1…

使用C++實現高效的套接字連接池

在現代網絡應用中&#xff0c;高效管理網絡連接是實現高并發和低延遲的重要因素。下面將詳細介紹如何使用C實現一個高效的套接字連接池&#xff0c;以便在需要時快速復用連接&#xff0c;從而提高系統性能和資源利用率。 一、什么是連接池&#xff1f; 連接池是一種管理網絡連…

RFID防盜門:守護您的商品資產安全!

在新零售運營管理中&#xff0c;防盜是至關重要的一環。根據美國零售聯合會發布的年度零售安全調查&#xff0c;2022年美國零售商損失了創紀錄的1121億美元。其中年度損失最大因素是由外部盜竊導致庫存損失和員工內部盜竊造成的。 然而傳統零售業商品資產盤點往往依賴人工排查&…

ConcurrentHashMap詳解 什么時候CAS什么時候synchronized

jdk:1.7 segment數組hashEntry數組鏈表實現 jdk版本&#xff1a;1.8&#xff1a;hashEntry數組紅黑樹實現 1、基本參數 //**1、最大容量** hashmap的最大容量也是這個&#xff0c;菜鳥一面被問到了 private static final int MAXIMUM_CAPACITY 1 << 30;//數組默認為…

《科技與健康》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

問題解答 問&#xff1a;《科技與健康》期刊萬方網可查嗎 答&#xff1a;萬方、維普可查 問&#xff1a;《科技與健康》是正規期刊嗎&#xff1f; 答&#xff1a;萬方維普收錄的正規期刊。主管單位&#xff1a;長江出版傳媒股份有限公司 主辦單位&#xff1a;湖北科學技術…

孩子出生后為什么要做聽力篩查?

孩子出生后為什么要做聽力篩查&#xff1f; 新生兒聽力篩查&#xff0c;就是對所有新生兒在盡早的時間&#xff08;出生48小時后&#xff09;進行系統的聽力篩查測試。據相關文獻報道&#xff0c;在我國&#xff0c;正常分娩的新生兒聽力障礙的發生率約為0.1&#xff5e;0.3%&a…

機場專用手持激光驅鳥器原理及優勢

在機場的驅鳥工作中&#xff0c;各類驅鳥設備共同構建起一道堅不可摧的防線&#xff0c;以保障航班的安全起降。其中激光驅鳥器以其卓越的性能和顯著效果&#xff0c;在機場鳥擊防治中發揮著至關重要的作用。 激光驅鳥器&#xff0c;分為大型自動式和小型手持式&#xff0c;其有…

Python 技能提升(二)

理想的類結構 Property裝飾器 # 傳統寫法 class Square1:def __init__(self):self.__side Nonedef get_side(self):return self.__sidedef set_side(self, side):assert side > 0, 邊長不能為負數&#xff01;self.__side sidedef del_side(self):# del self.__sideself.…

「前端+鴻蒙」核心技術HTML5+CSS3(十)

1、H5簡介 H5是HTML5的簡稱,是構建現代網站和網絡應用的標準標記語言。HTML5新增了許多功能,包括更好的多媒體支持、新的表單控件、繪圖功能以及對響應式設計的改進。 2、H5產品布局 移動端H5網站布局通常使用流體布局或彈性盒模型(Flexbox),以適應不同屏幕尺寸。 示例…

2024年有什么值得入手的5G長期套餐大流量卡推薦?大流量手機卡入手指南(超4款正規手機卡實測總結)

前言 24年有什么值得入手的5G大流量卡推薦&#xff1f;大流量手機卡入手指南&#xff08;超4款正規手機卡實測總結&#xff09; 四大運營商有哪些大流量卡&#xff0c;可電話&#xff0c;非物聯網卡 所有卡激活后&#xff0c;均可以在官方app可查、 所有都是優惠長期 5G大流…

Python-匿名函數

一、概念 匿名函數造出來的是一個內存地址&#xff0c;且內存地址沒有綁定任何名字&#xff0c;很快被當做垃圾清理掉。所以匿名函數只需要臨時調用一次&#xff0c;而有名函數永久使用&#xff1b; 匿名函數一般和其他函數配合使用&#xff1b; # 有名函數def func(x, y):…

抖音直播統計、直播間無人互動直播效果軟件--抖音大師!

抖音大師介紹 抖音大師是抖音直播統計、直播間無人互動直播效果軟件&#xff0c;通過它&#xff0c;你可以快速添加直播互動效果&#xff01;軟件使用C#開發&#xff0c;無論是內存占用還是執行效果都遠比同行的效果高太多&#xff01;&#xff01;電腦所需性能大大降低&#x…

內聯匯編簡介

在C語言中嵌入匯編&#xff08;Assembly&#xff09;代碼&#xff0c;可以使用內聯匯編&#xff08;Inline Assembly&#xff09;&#xff0c;這在一些需要精確控制硬件或者優化性能的場合非常有用 以下是關于ASM語法的介紹&#xff0c;主要基于GCC&#xff08;GNU Compiler C…

做軟件測試需要懂代碼嗎?

隨著大數據、機器學習時代的到來&#xff0c;不少人有了“測試不需要懂代碼&#xff0c;那我就試試”的想法。這就引發了一系列疑問&#xff1a;不懂代碼可以做測試嗎&#xff1f;測試人員到底需不需要懂代碼&#xff1f;測試人員需要寫代碼嗎&#xff1f; 其實&#xff0c;在…

精準檢測,可燃氣體報警系統的技術原理與特點

在現代化的工業生產與日常生活中&#xff0c;可燃氣體泄露事故頻發&#xff0c;給人們的生命和財產安全帶來了嚴重威脅。 因此&#xff0c;可燃氣體報警檢測系統的應用變得尤為重要。它不僅能夠實時監測環境中的可燃氣體濃度&#xff0c;還能在發現異常情況時及時報警&#xf…

記 Codes 開源免費研發管理平臺 —— 生成式全局看板的創新實現

繼上一回合瀑布與敏捷的融合創新實現后&#xff0c;本篇我們來講一講 Codes 生成式全局看板的創新實現。 市面上所有的研發管理軟件&#xff0c;看板模式的項目&#xff0c;都是物理看板的電子化&#xff0c;好像也沒什么問題&#xff0c;但是在使用過程中體驗非常不好&#xf…

WebSocket和HTTP協議對比

WebSocket和HTTP是兩種不同的通信協議&#xff0c;它們在多個方面存在顯著差異&#xff0c;主要區別包括&#xff1a; 通信模式&#xff1a; HTTP 是一種無狀態的、基于請求-響應模型的協議。這意味著通信總是由客戶端發起請求&#xff0c;服務器被動響應。每次請求和響應都是獨…

使用 zxing 生成二維碼以及條形碼

需求背景 前期在做項目的時候&#xff0c;有一個需求是說要生成一張條形碼&#xff0c;并且呢將條形碼插入到 excel 中去&#xff0c;但是之前一直沒有搞過找個條形碼或者是二維碼&#xff0c;最后是做出來了&#xff0c;這里呢就先看看怎么生成&#xff0c;后面再抽時間來寫寫…

一條SQL語句的執行究竟經歷了哪些過程

在數據庫管理系統(DBMS)中,一條SQL語句的執行過程復雜且精細,從用戶輸入到獲取結果,中間需要經過多個步驟和組件的協同工作。這些步驟包括解析、優化、執行和結果返回等。以下是SQL語句執行過程的詳細分析: 1. 客戶端連接 連接建立: 用戶通過客戶端(如應用程序、SQL客戶…