Linux 實現打印彩色進度條

文章目錄

    • 預備知識
      • 一、理解回車換行
      • 二、認識行緩沖
      • 1、代碼一、二(回車換行理解)
      • 2、代碼三、四(sleep函數和ffush函數理解)
    • 三、簡單倒計時
      • 1. 倒計時代碼
      • 2、效果展示
    • 四、進度條
      • 1、效果展示
      • 2、進度條代碼
        • makefile
        • ProcessBar.h
        • ProcessBar.c
        • main.c
      • 3、實現過程分析
        • 4.3.1 進度條實現樣式
        • 4.3.2 進度條實現方法

預備知識

一、理解回車換行

  • 在我們熟悉的C語言中,換行就可以跳轉的下一行開頭 ,但其實這一操作有兩個步驟,\r (回車)和 \n(換行)
  • 也就是先回到開頭,再進行換行

\r 回車就是回到這一行開頭
\n 換行就是另起一行

二、認識行緩沖

  • 在內存中預留了一塊空間,用來緩沖輸入或輸出的數據,這個保留的空間被稱為緩沖區。
  • 下面我們通過幾個代碼來理解一下:

1、代碼一、二(回車換行理解)

代碼一:

#include<stdio.h>int main()
{printf("hello world\n");return 0;
}

在這里插入圖片描述

代碼二:

  • 那我將這個\n換成了\r,再次打印會出現什么情況?
#include<stdio.h>int main()
{printf("hello world\r");return 0;
}

在這里插入圖片描述

在這里插入圖片描述

  • 發現 \n 可以打印出來,而 \r,不能打印出來,因為顯示器模式是行刷新緩沖區是按行緩沖的,沒有\n,就不能立即刷新。 \r 回到行首后,會進行覆蓋寫,shell 提示符會覆蓋掉之前寫的 “hello world”,如果我們在 “hello world” 不加 \r,則不會進行覆蓋寫,shell 提示符會順著 “hello world” 往后寫

如下:

在這里插入圖片描述

2、代碼三、四(sleep函數和ffush函數理解)

  • 行緩沖是緩沖區刷新策略的一種,在行緩沖模式下,當輸入和輸出中遇到 ‘\n’ 換行時,就會刷新緩沖區,下面我們認識頭文件<unistd.h>的三個函數

sleep:Linux 下的休眠函數,單位是秒
usleep:和sleep 一樣,單位ms(即10-6 m)
fflush :刷新緩沖區

代碼 3:

#include<stdio.h>
#include<unistd.h>int main()
{printf("hello world");sleep(3);return 0;
}

在這里插入圖片描述

  • 我們寫的這個C語言程序是從上到下依次執行的,而我們看到的是先休眠后打印
  • 這是因為數據保存在緩沖區中,沒有主動刷新。當程序退出后,保存在緩沖區中的數據被自動刷新出來了,如果我們想提前刷新,便可以調用fflush函數來刷新緩沖區

代碼四:

#include <stdio.h>
#include <unistd.h>                                                                                                     
int main()
{printf("hello world");fflush(stdout);printf("\n");sleep(3);return 0;
}

在這里插入圖片描述

  • 這次 “hello world” 被直接打印出來,我們加 \n避免shell 提示符出現在 “hello world” 后面

三、簡單倒計時

1. 倒計時代碼

#include <stdio.h>
#include <unistd.h>
int main()
{int cnt=10;while(cnt>=0){printf("%-2d\r",cnt);fflush(stdout);sleep(1);cnt--;                                                                                                                                            }printf("\n");return 0;
}

2、效果展示

在這里插入圖片描述

具備了以上介紹的知識,接下來我們就實現進度條了

四、進度條

1、效果展示

在這里插入圖片描述

2、進度條代碼

makefile
processbar:ProcessBar.c main.cgcc -o $@ $^ 
.PHONY:clean
clean:  rm -rf processbar
ProcessBar.h
#pragma once
#include <string.h>
#include <unistd.h>
#include <stdio.h>// 進度條箭頭
#define TAIL '>'// 進度條的數組大小
#define Length 102// 進度條加載的進度條
#define Style '='// 重定義函數指針
typedef void (*callback_t)(double, double);// 進度條的實現
void ProcBar(double total, double current);
ProcessBar.c
#include "ProcessBar.h"#define LIGHT_CYAN   "\033[1;36m" // 亮青色
#define NONE "\033[m" 	//截斷// 顯示進度
const char* lable = "|/-\\";void ProcBar(double total, double current)
{char bar[Length];// 初始化進度條memset(bar, '\0', sizeof(bar));int len = strlen(lable);int cnt = 0;double rate = (current * 100.0) / total;// 循環次數int loop_count = (int)rate;while (cnt < loop_count){bar[cnt++] = Style;if (rate < 100)bar[loop_count] = TAIL;}// 打印顯示printf(LIGHT_CYAN"[%-100s]"NONE"[%.2lf%%][%c]\r", bar, rate, lable[cnt % len]);// 刷新緩沖區fflush(stdout);
}
main.c
#include "ProcessBar.h"// 網絡帶寬【1mb】
double bandwidth = 1024 * 1024 * 1.0;void download(double filesize, callback_t cb)
{//  累計下載的數據量double current = 0.0;printf("download begin, current: %lf\n", current);while (current <= filesize){// 使用函數指針更新界面cb(filesize, current);//從網絡中獲取數據//......// 睡眠usleep(100000);// 累計下載current += bandwidth;}printf("\ndownload done, filesize: %lf\n", filesize);
}int main()
{// 測試調用//download(100 * 1024 * 1024, ProcBar);download(2 * 1024 * 1024, ProcBar);//download(200*1024*1024,ProcBar);//download(400*1024*1024,ProcBar);download(50*1024*1024,ProcBar);download(10*1024*1024,ProcBar);// 測試//ProcBar(100.0, 56.9);//ProcBar(100.0, 1.0);//ProcBar(100.0, 99.9);//ProcBar(100.0, 100);return 0;
}

3、實現過程分析

4.3.1 進度條實現樣式

進度條樣式 :

  • 進度條的主要內容是兩個中括號包裹,中間進度顯示以=>的方式進行推進呈現

進度條百分比:

  • 顯示當前進度百分比,隨著進度不斷推進,百分比也在增加

進度條旋轉字符:

  • 顯示加載樣式,可以利用一個旋轉的字符,例如 [] 的樣式,順時針不斷旋轉,依次為 “| / - \”,注意 ** 也是轉義字符,因此需要兩個 *\ *

進度條顏色:

c語言顏色參考
我們可以根據自己的喜好給進度條上色,在此我們找到顏色參照表

4.3.2 進度條實現方法
  • 預留進度條大小為 100 個 = ,外加 1 個 > ,加上保存 \0 的位置,定義一個102個單位的長度的bar數組。

  • 如果將打印放在循環中的話,在打印的時候會變得卡卡的,我們可以將打印放到循環外面,等數組放上=>后,在一起打印,這樣更好

  • 我們又實現了一個函數download(),把ProcBar(),作為參數傳遞給download(),用usleep函數模擬下載時間,然后循環起來回調processbar()函數,便實現了進度條

  • 最后考慮到第二次下載,bar數組滿了,我們再每次調用download()函數時,清空bar數組,完成實現~~

  • 這就實現了我們最終的效果

在這里插入圖片描述

最后本文就到這里結束了,感謝大家的收看,請多多指點~

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

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

相關文章

tomcat 反向代理 自建博客 修改狀態頁 等

一 自建博客 隨后&#xff0c;拷貝到webapps下面 并且做軟連接 隨后重定向 并且下載 cat >/etc/yum.repos.d/mysql.repo <<EOF [mysql57-community] nameMySQL 5.7 Community Server baseurlhttp://repo.mysql.com/yum/mysql-5.7-community/el/7/x86_64/ enabled1 g…

團體程序設計天梯賽 L2-006 樹的遍歷

L2-006 樹的遍歷 分數 25 給定一棵二叉樹的后序遍歷和中序遍歷&#xff0c;請你輸出其層序遍歷的序列。這里假設鍵值都是互不相等的正整數。 輸入格式&#xff1a; 輸入第一行給出一個正整數N&#xff08;≤30&#xff09;&#xff0c;是二叉樹中結點的個數。第二行給出其后…

【Linux】Linux系統磁盤分區和掛載相關命令介紹

Linux系統磁盤分區和掛載相關命令介紹 文章目錄 Linux系統磁盤分區和掛載相關命令介紹磁盤分區1、使用fdisk創建分區2、使用parted創建分區 格式化分區分區掛載自動掛載其他常見&#xff08;用&#xff09;的磁盤相關命令 在Linux系統中&#xff0c;磁盤分區和磁盤掛載是管理存…

第十四屆藍橋杯大賽B組 JAVA 蝸牛 (遞歸剪枝)

題目描述&#xff1a; 這天&#xff0c;一只蝸牛來到了二維坐標系的原點。 在 x 軸上長有 n 根竹竿。它們平行于 y 軸&#xff0c;底部縱坐標為 0&#xff0c;橫坐標分別為 x1, x2, …, xn。竹竿的高度均為無限高&#xff0c;寬度可忽略。蝸牛想要從原點走到第 n 個竹竿的底部也…

全域電商數據集成管理與采集|API接口的采集與管理

如今&#xff0c;全渠道零售已是大勢所趨。企業電商經營的一大現狀就是數據分散各處&#xff0c;比如有來自電商平臺私域數據、品牌一方數據、公開的第三方行業數據與電商平臺C端頁面數據等等。如何集成全域數據日益成為企業數字化基建的難題。 當前電商數據集成的主流方案為人…

【基于Matlab GUI的語音降噪系統設計】

客戶不要了&#xff0c;掛網上吧&#xff0c;有需要自行下載~ 賺點辛苦費 ** 功能實現: ** 1、導入音頻文件/錄入音頻&#xff0c;能實現播放功能。 2、對導入/錄入的音頻信號進行時域和頻域分析&#xff0c;并制圖。 3、可在導入/錄入的音頻信號上加入噪聲&#xff0c;并能夠播…

Apache JMeter 5.6.3 安裝

源碼下載 curl -O https://dlcdn.apache.org//jmeter/source/apache-jmeter-5.6.3_src.zipJMeter 下載 curl -O https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.3.zipjmeter.properties 里 設置中文 windows系統上解壓&#xff0c;雙擊jmeter.bat 啟動 執行參…

【人工智能】DeepLearning學習路線及簡要說明

目錄 神經網絡 1.1 前饋神經網絡(FNN) 結構和工作原理 訓練過程 應用

架構設計方法(4A架構)-應用架構

1、應用架構&#xff08;AA&#xff09;&#xff1a;業務價值與產品之間的橋梁&#xff0c;是企業架構的一個子集 2、應用架構包含“應用系統模塊、應用服務、應用系統集成”3個關鍵要素 3、收集AS-IS應用架構&#xff0c;描繪現狀&#xff0c;并識別改進機會點 4、描述對新系統…

uniapp 安卓YYEVAPlayer MP4禮物播放器原生插件

插件介紹 安卓YYEVAPlayer MP4禮物播放器原生插件&#xff0c;是一個輕量的動畫渲染庫&#xff0c;使用Native Opengles 渲染視頻&#xff0c;為你提供高性能、低開銷的動畫體驗 對比傳統的序列幀的動畫播放方式&#xff0c;具有更高的壓縮率&#xff0c;硬解碼效率更高的優點…

【NR 定位】3GPP NR Positioning 5G定位標準解讀(四)

目錄 前言 6 Signalling protocols and interfaces 6.1 支持定位操作的網絡接口 6.1.1 通用LCS控制平面架構 6.1.2 NR-Uu接口 6.1.3 LTE-Uu接口 6.1.4 NG-C接口 6.1.5 NL1接口 6.1.6 F1接口 6.1.7 NR PC5接口 6.2 終端協議 6.2.1 LTE定位協議&#xff08;LPP&#x…

TikTok企業認證教程:提升賬號可信度的必備步驟

TikTok企業認證是TikTok平臺用來驗證賬號真實性和權威性的方式。通過企業認證之后&#xff0c;企業能在TikTok上獲得官方標識&#xff0c;可以增強品牌的專業形象&#xff0c;也有利于提升用戶對企業內容的信任度。而且通過TikTok企業認證還可以解鎖高級功能&#xff0c;如數據…

貪心(基礎算法)--- 牛馬耍雜技

耍雜技的牛 農民約翰的N頭奶牛&#xff08;編號為1…N&#xff09;計劃逃跑并加入馬戲團&#xff0c;為此它們決定練習表演雜技。 奶牛們不是非常有創意&#xff0c;只提出了一個雜技表演&#xff1a; 疊羅漢&#xff0c;表演時&#xff0c;奶牛們站在彼此的身上&#xff0c…

@Resource和@Autowired區別

在Java Spring框架中&#xff0c;Resource和Autowired注解都用于依賴注入&#xff0c;但它們之間有一些區別&#xff1a; 來源: Autowired是Spring特定的注解&#xff0c;它通過類型匹配來進行自動裝配。Resource是Java EE&#xff08;javax.annotation.Resource&#xff09;提…

【MATLAB】語音信號識別與處理:T1小波濾波算法去噪及譜相減算法呈現頻譜

1 基本定義 T1小波濾波算法是一種基于小波變換的信號去噪算法。它可以有效地去除信號中的噪聲&#xff0c;并保留信號的主要特征。該算法的主要思想是將信號分解為多個不同尺度的小波系數&#xff0c;然后通過對小波系數進行閾值處理來去除噪聲。 具體來說&#xff0c;T1小波濾…

服務器數據恢復-服務器RAID5上層XFS文件系統分區數據恢復案例

服務器數據恢復環境&#xff1a; MD1200磁盤柜中的磁盤通過RAID卡創建了一組RAID5陣列&#xff0c;分配了一個LUN。在Linux操作系統層面對該LUN進行了分區&#xff0c;劃分sdc1和sdc2兩個分區&#xff0c;通過LVM擴容的方式將sdc1分區加入到了root_lv中&#xff1b;sdc2分區格式…

飛槳(PaddlePaddle)Tensor使用教程

文章目錄 飛槳&#xff08;PaddlePaddle&#xff09;Tensor使用教程1. 安裝飛槳2. 創建Tensor3. Tensor的基本屬性4. Tensor的操作5. Tensor的廣播機制6. Tensor與Numpy數組的轉換7. 結論 飛槳&#xff08;PaddlePaddle&#xff09;Tensor使用教程 1. 安裝飛槳 首先&#xff…

vue2+vxe-table的v3版本:設置vxe-table表格border顏色、單元格高度、斑馬線條紋顏色、表頭背景色和文字樣式

模板與樣式完整代碼 <vxe-table:data"tableData"height"auto"align"center"borderresizablestriperoundrow-id"id":row-config"{ isCurrent: true, isHover: true }":scroll-y"{ enabled: true, gt: 10 }":sho…

SSL證書驗證失敗怎么辦?常見SSL證書驗證失敗原因及解決辦法

網站與其訪問者建立信任的主要方式就是通過簽發SSL證書&#xff0c;因為SSL證書是由受信任的證書頒發機構&#xff08;CA&#xff09;在驗證某個網站真實性和可信任性之后才頒發的。但是&#xff0c;網站部署SSL證書后&#xff0c;偶爾會出現SSL證書驗證失敗而導致錯誤&#xf…

瞄準關基行業!Lockbit卷土重來,銀狐卷出新變種

Lockbit與銀狐木馬是亞信安全2023年重點關注的兩支勒索軟件家族。Lockbit可謂是2023年度最為活躍和猖獗的勒索軟件&#xff0c;受害者上千贖金破億&#xff0c;攻擊技能更是疊加buff不斷升級&#xff0c;在經歷國際聯合執法后在近期卷提重來。銀狐木馬則是2023年的“卷王”&…