【Linux】LInux下第一個程序:進度條

前言:

? ? ? ? 在前面的文章中我們學習了LInux的基礎指令

? ? ? 【Linux】初見,基礎指令-CSDN博客【Linux】初見,基礎指令(續)-CSDN博客

? ? ? ? 學習了vim編輯器【Linux】vim編輯器_linux vim insert-CSDN博客

? ? ? ? 學習了gcc/g++【Linux】編譯器gcc/g++及其庫的詳細介紹-CSDN博客

? ? ? ? 以及make/makefile【Linux】自動化構建-Make/Makefile-CSDN博客

有了以上知識的鋪墊,我們終于可以開始在Linux上編寫運行我們的代碼,于是我們來到了Linux下的第一個程序:進度條

1.回車換行符?

? ? ? ?大多數人可能覺得"回車換行"這一詞指的是同一個東西。但其實回車是回車、換行是換行,這兩個有本質區別。

????????我們日常使用的回車鍵合成了"回車"和"換行"功能,這就導致了大家覺得這是一個東西。

回車的符號為:\n
回車的功能是將光標重置到最開始位置

換行的符號為:\r?
換行的功能是將光標下移一行

2.緩沖區問題

什么是緩沖區?

????????緩沖區是系統預留的內存區域,其作用是暫時存放輸入或輸出的數據。引入緩沖區主要是為了平衡高速的 CPU 與低速的 I/O 設備之間的速度差異,進而提升系統的整體性能。

刷新緩沖區?

????????通常情況下,數據會先被存儲在緩沖區中,只有當緩沖區滿、遇到特定的控制字符,或者程序運行結束時,才會將數據真正寫入目標設備。不過,在某些特定場景下,可能需要手動刷新緩沖區,以確保數據能及時輸出。

舉例:

//代碼1
#include<stdio.h>
#include<unistd.h>
int main()
{printf("hello\n");                                                                                                                                       sleep(3);    
}//代碼2
#include<stdio.h>
#include<unistd.h>
int main()
{                                                                                                                            printf("hello");sleep(3);    
}

運行代碼1:我們可以看到顯示屏上馬上顯示出"hello",然后停滯3秒結束程序

運行代碼2:我們看到是恰恰相反,先停滯3秒后打印出"hello",然后結束程序

這個就是緩沖區的問題:"\n"可以馬上刷新緩沖區,所以代碼1可以馬上顯示。而沒有"\n",就無法馬上刷新緩沖區,當整個程序結束后系統自動刷新,顯示"hello"

那如何使其馬上刷新?

fflush(stdout)

3.預備代碼

先創建文件夾,并在文件夾中創建相應的.c .h文件

hyc@hcss-ecs-4ce7:~$ mkdir progress
hyc@hcss-ecs-4ce7:~$ cd progress
hyc@hcss-ecs-4ce7:~/progress$ touch p.c p.h main.c

編寫代碼,與makefile。進度條只會在一行打印,所以我們不能使用 \n,而是使用 \r,在同一行打印

但是當我們運行代碼時,發現并沒有顯示結果。這是因為當前數據還在緩沖區沒有刷新出來,我們使用ffulsh(stdout)使其馬上刷新

這時我們可以看到結果:在同一位置上顯示

4.進度條代碼

4.1首先先看看我們想實現一個什么樣子的進度條

4.2代碼實現?

我們一步一步來,先實現左側部分

1.考慮使用字符數組來表示遞增的進度條。先將字符數組初始化為 ‘\0’,通過%s打印時遇到 ‘\0’就會停止。

2.通過計數器計數,來計算輸出多少符號

3.通過fflush(stdout)立馬刷新緩沖區,讓我們看到結果

4.通過sleep讓我們看到其過程

5.最后為了避免命令行覆蓋我們輸出的內容,進行換行操作

最后添加一下左右中括號,修改一下細節問題:

打印進度條使用%-100s占位符

sleep有點太慢了,我們可以使用usleep

#include"p.h"
#include<unistd.h>
#include<string.h>void progress_v1()
{char arr[101];memset(arr,'\0',sizeof(arr));int num=0;for(int i=0;i<=101;i++){   arr[num]='X';printf("[%-100s]\r",arr);fflush(stdout);usleep(10000);num++;}   printf("\n");
}  

效果

接下來我們就可以來考慮一下百分比和旋轉光標了

1.百分比直接去計算就好了,沒什么好說的。

2.旋轉光標:我們不要去想復雜了,動態的本質其實就是一幀一幀的靜態圖像,我們只需要寫一個字符數組x,然后不斷的打印字符,就可以實現旋轉光標了。?

#include<stdio.h>
#include<unistd.h>
#include<string.h>void progress_v1()
{char arr[101];char x[]={'/','-','\\','\0'};memset(arr,'\0',sizeof(arr));int num=0;for(int i=0;i<=101;i++){   arr[num]='X';printf("[%-100s][%.2f][%c]\r",arr,num*1.0/sizeof(arr)*100,x[num%3]);fflush(stdout);usleep(10000);num++;}   printf("\n");
}  

效果演示:

5.模擬真實環境

一個真正的進度條不可能就我們上面寫的代碼一樣自顧自的打印。應該是根據實際情況,一邊下載(或其他操作),一邊打印進度條。

于是我們實現一個download函數模擬實時下載環境?

total:表示一共想要下載的量

speed:表示單次下載的速度

每下載一次就更新一次進度條

通過實時的下載量來計算進度條中需要打印的個數,以及百分比。?

代碼匯總:?

//p.h#include<stdio.h>
void progress_v1();
void progress_v2(double cur,double total);        //p.c#include"p.h"
#include<unistd.h>
#include<string.h>void progress_v1()
{char arr[101];char x[]={'/','-','\\','\0'};memset(arr,'\0',sizeof(arr));int num=0;for(int i=0;i<=101;i++){arr[num]='X';printf("[%-100s][%.2f][%c]\r",arr,num*1.0/sizeof(arr)*100,x[num%3]);fflush(stdout);usleep(10000);num++;}   printf("\n");
}void progress_v2(double cur,double total)
{char arr[101];char x[]={'/','-','\\','\0'};memset(arr,'\0',sizeof(arr));//get the numberint num=(int)(cur*100/total);for(int i=0;i<num;i++){   arr[i]='X';}   printf("[%-100s][%.2f][%c]\r",arr,cur*100/total,x[num%3]);fflush(stdout);
}//main.c#include <stdio.h>
int main()
{printf("Hello world\n");return 0;
}                                                                                                                                         

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

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

相關文章

Web前端基礎

### 一、瀏覽器 火狐瀏覽器、谷歌瀏覽器(推薦)、IE瀏覽器 推薦谷歌瀏覽器原因&#xff1a; 1、簡潔大方,打開速度快 2、開發者調試工具&#xff08;右鍵空白處->檢查&#xff0c;打開調試模式&#xff09; ### 二、開發工具 核心IDE工具 1. Visual Studio Code (VS Code)?…

C++調試(肆):WinDBG分析Dump文件匯總

目錄 1.前言 2.WinDBG中常用的指令 3.分析異常時要關注的信息 4.心得 前言 本篇博客主要針如何使用WinDBG工具調試Dump文件的流程進行一個講解&#xff0c;具體捕獲的Dump文件也是前兩節例子中生成的Dump文件。 WinDBG中常用的指令 關于WinDBG調試時常用的指令主要分為以下幾種…

SOC-ESP32S3部分:33-聲學前端模型ESP-SR

飛書文檔https://x509p6c8to.feishu.cn/wiki/YnbmwtqI5iBwE3kHA7AcZ3yTnLf ESP-SR 是樂鑫官方開發的一個音頻組件&#xff0c;支持以下模塊&#xff1a; 聲學前端算法 AFE喚醒詞檢測 WakeNet命令詞識別 MultiNet語音合成&#xff08;目前只支持中文&#xff09; 組件地址&am…

基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql數據庫,在線考試系統

詳細視頻&#xff1a;【基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql數據庫&#xff0c;在線考試系統-嗶哩嗶哩】 https://b23.tv/7hwmwmQ

【Linux】shell中的運行流程控制

目錄 一.什么是運行流程控制 二.條件允許流程控制--if 2.1.單分支 2.2.雙分支 2.3.多分支 if多分支練習 三.循環運行流程控制 無判定循環--for 判斷循環--while&#xff0c;until 四.選擇運行流程控制 五.自動應答--expect 5.1.固定位置的交互應答 5.2.非固定位置的…

新能源汽車熱管理核心技術解析:冬季續航提升40%的行業方案

新能源汽車熱管理核心技術解析&#xff1a;冬季續航提升40%的行業方案 摘要&#xff1a;突破續航焦慮的關鍵在熱能循環&#xff01; &#x1f449; 本文耗時72小時梳理行業前沿方案&#xff0c;含特斯拉/比亞迪等8家車企熱管理系統原理圖 一、熱管理為何成新能源車決勝關鍵&am…

OCR MLLM Evaluation

為什么需要評測體系&#xff1f;——背景與矛盾 ?? 能干的事&#xff1a;?? 看清楚發票、身份證上的字&#xff08;準確率>90%&#xff09;&#xff0c;速度飛快&#xff08;眨眼間完成&#xff09;。??干不了的事&#xff1a;?? 碰到復雜表格&#xff08;合并單元…

深入解析JVM工作原理:從字節碼到機器指令的全過程

一、JVM概述 Java虛擬機(JVM)是Java平臺的核心組件&#xff0c;它實現了Java"一次編寫&#xff0c;到處運行"的理念。JVM是一個抽象的計算機器&#xff0c;它有自己的指令集和運行時內存管理機制。 JVM的主要職責&#xff1a; 加載&#xff1a;讀取.class文件并驗…

Python繪圖庫及圖像類型之特殊領域可視化

Python繪圖庫及圖像類型之基礎圖表-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148433762?spm1001.2014.3001.5501 Python繪圖庫及圖像類型之高級可視化-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/148450750?spm1001.2014.3001.…

04 APP 自動化- Appium toast 元素定位列表滑動

文章目錄 一、toast 元素的定位二、滑屏操作 一、toast 元素的定位 toast 元素就是簡易的消息提示框&#xff0c;toast 顯示窗口顯示的時間有限&#xff0c;一般3秒左右 # -*- codingutf-8 -*- from time import sleep from appium import webdriver from appium.options.an…

C/C++ OpenCV 矩陣運算

C/C OpenCV 矩陣運算詳解 &#x1f4a1; OpenCV 是一個強大的開源計算機視覺和機器學習庫&#xff0c;它提供了豐富的矩陣運算功能&#xff0c;這對于圖像處理和計算機視覺算法至關重要。本文將詳細介紹如何使用 C/C 和 OpenCV 進行常見的矩陣運算。 矩陣的創建與初始化 在進…

基于大模型的 UI 自動化系統

基于大模型的 UI 自動化系統 下面是一個完整的 Python 系統,利用大模型實現智能 UI 自動化,結合計算機視覺和自然語言處理技術,實現"看屏操作"的能力。 系統架構設計 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…

USB擴展器與USB服務器的2個主要區別

在現代辦公和IT環境中&#xff0c;連接和管理USB設備是常見需求。USB擴展器&#xff08;常稱USB集線器&#xff09;與USB服務器&#xff08;如朝天椒USB服務器&#xff09;是兩類功能定位截然不同的解決方案。前者主要解決物理接口數量不足的“近身”連接擴展問題&#xff0c;而…

Nuxt.js 中的路由配置詳解

Nuxt.js 通過其內置的路由系統簡化了應用的路由配置&#xff0c;使得開發者可以輕松地管理頁面導航和 URL 結構。路由配置主要涉及頁面組件的組織、動態路由的設置以及路由元信息的配置。 自動路由生成 Nuxt.js 會根據 pages 目錄下的文件結構自動生成路由配置。每個文件都會對…

驗證負載均衡與彈性伸縮

什么是彈性伸縮&#xff08;Auto Scaling&#xff09;&#xff1f; 彈性伸縮是指 云計算平臺根據實時負載自動調整計算資源&#xff08;如服務器實例、容器Pod&#xff09;數量&#xff0c;以確保系統在高峰時保持穩定&#xff0c;在低谷時節省成本。 什么時候會觸發彈性伸縮&…

區分viewmodel和model職責的方法

gpt回答挺好的&#xff0c;我就分享一下。 1. 最經典的一句話區分 Model&#xff08;Repository/數據層&#xff09;&#xff1a;只負責**“數據獲取/存儲/持久化”和“核心業務算法”**&#xff0c;不依賴UI層和Android框架&#xff0c;可以脫離界面獨立存在。 ViewModel&…

C語言數據結構筆記3:Union聯合體+結構體取8位Bool量

本文銜接上文要求&#xff0c;新增8位bool量的獲取方式。 目錄 問題提出&#xff1a; Union聯合體struct結構體(方式1)&#xff1a; Union聯合體struct結構體(方式2)&#xff1a; BYTE方式讀取&#xff1a; 問題提出&#xff1a; 在STM32單片機的編程中&#xff0c;無法定義Boo…

三種讀寫傳統xls格式文件開源庫libxls、xlslib、BasicExcel的比較

最近準備讀寫傳統xls格式文件&#xff0c;而不是較新的xlsx&#xff0c;詢問DeepSeek有哪些開源庫&#xff0c;他給出了如下的簡介和建議&#xff0c;還給出了相應鏈接&#xff0c;不過有的鏈接已失效。最后還不忘提醒&#xff0c;現在該用xlsx格式了。 以下是幾個可以處理傳統…

從測試角度看待CI/CD,敏捷開發

什么是敏捷開發&#xff1f; 是在高強度反饋的情況下&#xff0c;短周期&#xff0c;不斷的迭代產品&#xff0c;滿足用戶需求&#xff0c;搶占更多的市場 敏捷開發是什么&#xff1f; 是一種產品快速迭代的情況下&#xff0c;降低出錯的概率&#xff0c;具體會落實到公司的…

figma MCP + cursor如何將設計稿生成前端頁面

一、準備工作 figma MCP需要通過figma key來獲取設計稿權限&#xff0c;key的生成步驟如下 1. 打開figma網頁版/APP&#xff0c;進入賬戶設定 2. 點擊生成token 3. 填寫內容生成token(一定要確認復制了&#xff0c;不然關閉彈窗后就不會顯示了) 二、配置MCP 4. 進入到cursor…