【Linux】進度條

本文中,我們來寫一個進度條。

本文大綱:

寫一個命令行版的進度條。

1.回車換行

2.緩沖區問題(本文不深究)

? 2.1測試代碼

3.寫一個什么樣的進度條?

? version1

? version2

回車換行

這倆不是一個概念:

在計算機語言中,換行是\n,回車是\r。\n\r是回車換行。

如果改成這樣:

我們就會發現,等待3秒后才會打印出來。

那么,先執行的是printf,還是sleep呢?

我們的程序永遠都是從前往后執行的。

為什么printf執行完了顯示器沒有顯示?在我們休眠的時間里,我們的字符串在哪?

在緩存區里。

那為什么有’\n’,就能先打印出來呢?

因為行刷新

而我們沒有’\n’,是因為程序結束了會自動刷新緩沖區。

如果我們想讓不帶’\n’的自動刷新呢?

fflush

我們的程序會自動打開這三個流。

stdin是鍵盤。stdout和stderr是顯示器。

我們知道,linux下一切皆文件,printf是往stdout里寫入。

所以我們也可以加一個參數,然后寫成fprintf版本:

使用fflush:

測試代碼:

如果我們想在同一個位置打印呢?那就不能讓它換行了。

光標的位置永遠是輸入下一個字符的位置。

所以我們這樣修改:

這里,如果我們把i定義為10,就會發現:

倒計時到1的時候顯示的是:

理解顯示

當我們在屏幕上打印12345時,打印的是整數12345,還是字符’1’‘2’‘3’‘4’'5’呢?

答案是后者。

**顯示器只認字符!**所以我們說,顯示器是字符設備

這也是為什么平時printf時,要格式化輸出。

比如我們int a;,printf內部把我們的a由整數轉成字符串,然后再由類似putc這樣的接口把字符一個個顯示出來。

我們這樣修改:

怎么理解這個%2d呢?

這代表位寬為2,一次顯示兩個字符,如果只有一個字符,會把后面的字符清理掉,可以理解為顯示的是02或者空格2.

我們還可以改成,讓數字靠屏幕左側顯示:

這樣修改,表示左對齊。

寫一個什么樣的進度條?

左側的這個中括號里面,隨著右側中括號里的百分比增加,井號增加(但不會講右側中括號向后擠),同時最右側的中括號中/進行旋轉。

原理版本(version1)

用sleep會太慢了,所以我們改用usleep:

微秒

1s=100w微秒

我們可以先寫出井號部分的中括號:

然后再寫出百分比的中括號:

旋轉光標

我們將這4個字符覆蓋式地顯示:| / - \\,就可以得到我們想要的效果。

\\是因為要取字面值,才能得到我們想要的\

然后我們可以比較巧妙地這樣來顯示:

這個進度條可以跑了,但是沒法使用。

如果未來我們是在下載東西的時候打印進度條:

這樣進度條的進度與我們的下載進度不符。

真實版本

應該是邊下載邊更新。

所以我們接下來把process.h改成:

然后我們再來寫process.c

然后會看到報錯:

所以我們要這樣:

然后我們就可以得到:

然后我們發現沒到100,需要改一下這里:

最后修改

我們最后將其改為回調函數形式的,更好:

Thanks?(・ω・)ノ

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

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

相關文章

SLAM/數字圖象處理基礎

概念 視差:相同特征的不同深度估計的偏差 BoW,DBoW,DBoW2的區別是什么 Bag of Words (BoW)、DBoW(Dynamic Bag of Words)和DBoW2是用于圖像處理和計算機視覺中的不同特征表示和匹配方法。它們之間的主要區別如下&am…

UE5材質節點SimpleGrassWind

SimpleGrassWind節點可以模擬樹葉擾動,或小草晃動效果 用來做風格化樹、風格化草效果很好 主要節點 前三個節點分別用來控制,風強度,風重力,風速度,WPO是世界位置偏移

WeNet:面向生產的流式和非流式端到端語音識別工具包

這篇文章介紹了WeNet,一個面向生產的開源端到端(E2E)語音識別工具包。WeNet的主要特點和貢獻如下: 統一流式和非流式識別:提出了一種名為U2的兩階段框架,能夠在單一模型中同時支持流式和非流式語音識別&…

Ubuntu20.04安裝Foxit Reader 福昕閱讀器

Ubuntu20.04安裝Foxit Reader 福昕閱讀器 文章目錄 Ubuntu20.04安裝Foxit Reader 福昕閱讀器 先更新一下源 sudo apt update sudo apt upgrade下載Foxit Reader的穩定版本 wget https://cdn01.foxitsoftware.com/pub/foxit/reader/desktop/linux/2.x/2.4/en_us/FoxitReader.e…

2024年底關于期貨的工作總結

十幾年程序猿出身,因幾年前的懵懂無畏闖入期貨市場,盈了,感覺期貨太簡單,飄然裸辭,想當財務自由者,全職做交易。當深入學習時,卻虧了,原來市場是讓人敬畏的,也是反人性的…

c++入門——c++輸入cin和輸出cout的簡單使用

c輸入cin、輸出cout 1 cin2 cout3 cin和cout說明 c在c語言的輸入、輸出函數的基礎上進行了封裝。 1 cin c可以理解為控制臺,in可以理解為輸入。 參考代碼: void f(){int a;float b;double c;char d;cin>>a>>b>>c>>d;//這里和…

PlantUML 時序圖 基本例子

基本的例子 序列-> 用于繪制兩個參與者之間的信息。參與者不必明確聲明。 要有一個點狀的箭頭&#xff0c;就用--> 也可以用<- 和<-- 。這不會改變繪圖&#xff0c;但可能提高可讀性。注意&#xff0c;這只適用于順序圖&#xff0c;其他圖的規則不同。 plantum…

YOLOv10-1.1部分代碼閱讀筆記-utils.py

utils.py ultralytics\nn\modules\utils.py 目錄 utils.py 1.所需的庫和模塊 2.def _get_clones(module, n): 3.def bias_init_with_prob(prior_prob0.01): 4.def linear_init(module): 5.def inverse_sigmoid(x, eps1e-5): 6.def multi_scale_deformable_attn_py…

vue3使用video-player實現視頻播放(可拖動視頻窗口、調整大小)

1.安裝video-player npm install video.js videojs-player/vue --save在main.js中配置全局引入 // 導入視頻播放組件 import VueVideoPlayer from videojs-player/vue import video.js/dist/video-js.cssconst app createApp(App) // 視頻播放組件 app.use(VueVideoPlayer)2…

基于卷積神經網絡的甲狀腺結節識別系統,resnet50,mobilenet模型【pytorch框架+python源碼】

更多目標檢測、圖像分類識別、目標追蹤等項目可看我主頁其他文章 功能演示&#xff1a; 甲狀腺結節識別系統&#xff0c;卷積神經網絡&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源碼】_嗶哩嗶哩_bilibili &#xff08;一&#xff09;簡介 …

C++--類與對象

1.封裝 封裝是c面向對象的三大特性之一 將屬性和行為作為一個整體 將屬性和行為加以權限控制 語法&#xff1a; class 類名{ 訪問權限: 屬性/行為 }; 訪問權限 public 公共權限 類內類外均可以訪問 protected 保護權限 類內可以訪問&#xff0c;類外不可以訪問 pr…

區塊鏈期末復習3:跨鏈原子交換其他加密貨幣

參考教材&#xff1a;《區塊鏈&#xff1a;技術驅動金融》 一、跨鏈原子交換&#xff08;不可分割的交叉鏈互換&#xff09; 1.實施步驟 假設Alice要拿1BTC交換Bob的3BCY。Alice作為交易的發起者。 1&#xff09;Alice創建一個secret&#xff08;一個隨機數x), 并計算其哈希…

OCR實踐-Table-Transformer

前言 書接上文 OCR實踐—PaddleOCR Table-Transformer 與 PubTables-1M table-transformer&#xff0c;來自微軟&#xff0c;基于Detr&#xff0c;在PubTables1M 數據集上進行訓練&#xff0c;模型是在提出數據集同時的工作&#xff0c; paper PubTables-1M: Towards comp…

重裝操作系統后 Oracle 11g 數據庫數據還原

場景描述&#xff1a; 由于SSD系統盤損壞&#xff0c;更換硬盤后重裝了操作系統&#xff0c;Oracle數據庫之前安裝在D盤(另一個硬盤)&#xff0c;更換硬盤多添加一個盤符重裝系統后盤符從D變成E&#xff0c;也就是之前的D:/app/... 變成了現在的 E:/app/...&#xff0c;重新安裝…

gozero項目接入elk的配置與實戰

在 **GoZero** 項目中接入 **ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;** 來進行日志管理&#xff0c;是一個非常強大的監控和分析方案。通過集成 ELK&#xff0c;你可以收集、存儲、查詢和可視化日志數據。 在這里&#xff0c;我將介紹如何在 GoZero 項目中…

探索PIL庫:Python圖像處理的強大工具

文章一覽 前言一、PIL圖像處理庫簡介二、基本概念2.1顏色模型2.1.1 RGB 顏色模型2.1.2 CMY色彩空間 2.2 通道2.3 圖像數據2.4 模式 三、用PIL做圖像處理3.1 圖像縮放、翻轉等處理3.1.1 圖像縮放處理3.1.2 圖像旋轉處理&#xff08;1&#xff09;PIL 提供的函數:&#xff08;2&a…

boot工程需求

1、 關閉看門狗、初始化中斷和trap向量表&#xff0c;進行時鐘和外設初始化&#xff0c;讓芯片正常運行起來 2、 提供CAN ETH等用于通訊功能的驅動&#xff0c;能夠接受外部數據的傳輸請求 3、 提供Flash的讀寫與擦除驅動&#xff0c;設置服務來對通訊端接受到的數據更新代…

C#中的類型和函數參數傳遞

1.類型 C#中類型分為兩類&#xff1a;值類型和引用類型 1.值類型 所有值類型繼承自System.ValueType類&#xff08;這是System.Object的一個子類&#xff09; 值類型變量是直接存儲數據&#xff0c;值類型變量聲明后&#xff0c;不管是否賦值&#xff0c;編譯器都會為其分配…

android系統查找應用包名以及主activity:

一、查找應用的主activity&#xff1a; pm list packages 發現所有的包 dumpsys package 包名&#xff1a; 獲取所有的包信息&#xff0c;可以所有關鍵詞MAIN來找主activity 也可以通過下面命令找到所有activity&#xff0c;看下面大概率com.android.settings/.Settings為主ac…

微信V3支付報錯 平臺證書及平臺證書序列號

1.平臺證書及平臺證書序列號設置錯誤報錯&#xff1a; 錯誤1&#xff1a; Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…