Linux探秘坊-------4.進度條小程序

1.緩沖區

#include <stdio.h>
int main()
{printf("hello bite!");sleep(2);return 0;
}

執行此代碼后,會 先停頓兩秒,再打印出hello bite,但是明明打印在sleep前面,為什么會后打印呢?

因為:

  • 在printf執行完了后,打印的內容被存到了緩沖區
  • 程序快結束時緩存區的內容再打印到顯示器

奇妙的事情發生了:

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

如果我們使用這樣的代碼,會 先打印出hello bite,再停頓兩秒,為啥捏?

可以發現和上面的代碼對比多了一個/n

  • 顯示器有一種刷新策略,叫 行刷新
  • /n正好代表著換行,所以加了/n的內容會 直接從緩存區打印到顯示器上不用等程序結束

那么我們有沒有辦法 不用\n也能先打印呢?
包有的:

#include <stdio.h>
int main()
{printf("hello bite!");fflush(stdout);sleep(3);return 0;
}
  • 這里的fflush(stdout)就起到了 刷新的作用

2.進度條(V1)

1.process.h

在這里插入圖片描述

2.main.c

在這里插入圖片描述

3.process.c(重點)

在這里插入圖片描述

#include"process.h"2 #include<string.h>3 #include<unistd.h>4 5 #define size 101//需要考慮\0所以不是1006 #define style '#'7 8 void process()9 {10   int rate =0;11   char num[size];12   memset(num,0,sizeof(num));//這里是讓num全部置空
W> 13   char* lable="|/-\\";//這里是模擬進度條后的圈圈14   int length=strlen(lable);15   while(rate<=100)16   {17     printf("[%-100s][%d%%][%c]\r",num,rate,lable[rate%length]);//100s是指預留100個字符,主要是為讓】不動,但這樣會導致倒著打印,所以需要加-,      \r是指每次打印完了之后都恢復到原位置18     fflush(stdout);//這里因為沒有\n所以需要fflush進行刷新19     num[rate]=style;20     ++rate;21     usleep(50000);//usleep和sleep不同,前者單位是微秒 50000微秒=0.5秒22   }23 24   printf("\n");25 }  

3.進度條(V2)

1.process.h

在這里插入圖片描述

2.process.c(重點)

在這里插入圖片描述

void flushprocess(const char*tips, double total,double current)29 {30   const char *lable="|/-\\";31   int len =strlen(lable);32   static int index=0;33   char num[size];34   memset(num,0,sizeof(num));//將num置空35 36   double rate=current*100.0/total;//計算下載進度37   int n=(int)rate;//用下載進度確定有多少個#                                                                                                  38 39   int i=0;40   for(;i<n;i++)41     num[i]=style;//填充#到num中42 43   printf("%s...[%-100s][%.1lf%%][%c]\r",tips,num,rate,lable[index++]);//進度保留一位小數44   fflush(stdout);//因為沒有使用\n,卻又想直接刷新,所以需要fflush,記得包頭文件#include<unistd.h>45   index %=len;46   if(n>=100)printf("\n");47 }

3.main.c(重點)

在這里插入圖片描述

#include"process.h"3 #include<unistd.h>4 #include<time.h>5 #include<stdlib.h>6 7 typedef void (*call)(const char*, double,double);//定義函數指針類型8 9  10 11 double speed[]={5.0,0.5,0.3,0.02,0.1,0.01};//模擬網速的波動   12                                                               13 void download(int total,call cb)                              14 {                                                             15   srand(time(NULL));//設置種子                                16   double current =0.0;                                        17   while(current<=total)                                       18   {                                                           19     cb("下載中 ",total,current);                              20     if(current>=total)break;                                  21     int random=rand()%6;//隨機匹配網速                        22     usleep(5000);                                             23     current+=speed[random];//加上每次下載的進度               24     if(current>=total)current=total;//有可能總和超過total,這樣就沒法顯示100%,所以需要改為total25   }                                                           26 }                                                             27                                                               28                                                               29                                                               30                                                               31 int main()                                                    32 {                                                             33    download(1024.0,flushprocess);//傳遞文件大小和函數地址                                                                                      34    printf("下載 1024.0MB 完成\n");                                 35    download(512.0,flushprocess);                                   36    printf("下載 512.0MB 完成\n");                                  37    download(256.0,flushprocess);                                   38    printf("下載 256.0MB 完成\n");                                  39    download(128.0,flushprocess);                                   40    printf("下載 128.0MB 完成\n");                                  41                                                                    42    return 0;                                                       43 }     

效果如下:
在這里插入圖片描述

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

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

相關文章

基于Python的Diango旅游數據分析推薦系統設計與實現+畢業論文(15000字)

基于Python的Diango旅游數據分析推薦系系統設計與實現畢業論文指導搭建視頻&#xff0c;帶爬蟲 配套論文1w5字 可定制到某個省份&#xff0c;加40 基于用戶的協同過濾算法 有后臺管理 2w多數據集 可配套指導搭建視頻&#xff0c;加20 旅游數據分析推薦系統采用了Python語…

Scrapy:DownloaderAwarePriorityQueue隊列設計詳解

DownloaderAwarePriorityQueue 學習筆記 1. 簡介 DownloaderAwarePriorityQueue 是 Scrapy 中一個高級的優先級隊列實現&#xff0c;它不僅考慮請求的優先級&#xff0c;還會考慮下載器的負載情況。這個隊列為每個域名&#xff08;slot&#xff09;維護獨立的優先級隊列&#…

dify-AI 私有部署可修改前端頁面

dify文檔 官方文檔&#xff1a;歡迎使用 Dify | Dify 源碼&#xff1a;https://github.com/langgenius/dify.git 安裝docker 官網&#xff1a;https://www.docker.com/ 部署服務到docker cd dify cd docker cp .env.example .env docker compose up -d查看效果 http://localh…

PHP基礎部分

但凡是和輸入、寫入相關的一定要預防別人植入惡意代碼! HTML部分 語句格式 <br> <hr> 分割符 <p>插入一行 按住shift 輸入! 然后按回車可快速輸入html代碼(VsCode需要先安裝live server插件) html:<h1>標題 數字越大越往后</h1> <p…

【Elasticsearch】Retrieve inner hits獲取嵌套查詢的具體的嵌套文檔來源,以及父子文檔的來源

Retrieve inner hits 是 Elasticsearch 中的一個功能&#xff0c;用于在嵌套查詢或父子查詢中&#xff0c;返回導致主文檔匹配的具體嵌套對象或子/父文檔的詳細信息&#xff0c;幫助用戶更直觀地理解查詢結果的來源。 在 Elasticsearch 中&#xff0c;Retrieve inner hits是一…

SpringCloud面試題----eureka和zookeeper都可以提供服務注冊與發現的功能,請說說兩個的區別

dEureka 和 Zookeeper 都可以提供服務注冊與發現的功能,它們的區別主要體現在以下幾個方面: 設計理念 Eureka:是基于 RESTful 風格設計的,強調簡單、輕量級,旨在為微服務架構提供一種易于使用的服務發現解決方案,注重服務的可用性和靈活性。Zookeeper:最初是為分布式協…

數據庫提權總結

Mysql提權 UDF提權是利用MYSQL的自定義函數功能&#xff0c;將MYSQL賬號轉化為系統system權限 前提&#xff1a; 1.UDF提權條件 &#xff08;1&#xff09;Mysql版本大于5.1版本udf.dll文件必須放置于MYSQL安裝目錄下的lib\plugin文件夾下。 &#xff08;2&#xff09;Mysql…

“深入淺出”系列之QT:(10)Qt接入Deepseek

項目配置&#xff1a; 在.pro文件中添加網絡模塊&#xff1a; QT core network API配置&#xff1a; 將apiUrl替換為實際的DeepSeek API端點 將apiKey替換為你的有效API密鑰 根據API文檔調整請求參數&#xff08;模型名稱、溫度值等&#xff09; 功能說明&#xff1a; 使…

【Linux探索學習】第二十七彈——信號(上):Linux 信號基礎詳解

Linux學習筆記&#xff1a; https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; 前面我們已經將進程通信部分講完了&#xff0c;現在我們來講一個進程部分也非常重要的知識點——信號&#xff0c;信號也是進程間通信的一…

nginx負載均衡, 解決iphash不均衡的問題之consistent

原因分析 客戶端IP分布不均&#xff1a;部分IP段請求集中&#xff0c;導致哈希到同一后端。 服務器數量變動&#xff1a;增刪節點時&#xff0c;傳統ip_hash未使用一致性哈希&#xff0c;導致分布重置。 哈希鍵范圍過小&#xff1a;例如僅使用IPv4前24位&#xff0c;不同IP可…

[C++]多態詳解

目錄 一、多態的概念 二、靜態的多態 三、動態的多態 3.1多態的定義 3.2虛函數 四、虛函數的重寫&#xff08;覆蓋&#xff09; 4.1虛函數 4.2三同 4.3兩種特殊情況 &#xff08;1&#xff09;協變 &#xff08;2&#xff09;析構函數的重寫 五、C11中的final和over…

WEB安全--SQL注入--PDO與繞過

一、PDO介紹&#xff1a; 1.1、原理&#xff1a; PDO支持使用預處理語句&#xff08;Prepared Statements&#xff09;&#xff0c;這可以有效防止SQL注入攻擊。預處理語句將SQL語句與數據分開處理&#xff0c;使得用戶輸入的數據始終作為參數傳遞給數據庫&#xff0c;而不會直…

ES12 weakRefs的用法和使用場景

ES12 (ECMAScript 2021) 特性總結&#xff1a;WeakRef 1. WeakRef 概述 描述 WeakRef 是 ES12 引入的一個新特性&#xff0c;用于創建對對象的弱引用。弱引用不會阻止垃圾回收器回收對象&#xff0c;即使該對象仍然被弱引用持有。WeakRef 通常與 FinalizationRegistry 結合使…

50頁精品PPT | 某大數據資產平臺建設項目啟動會材料

該PPT主要介紹了某集團大數據資產平臺建設項目的啟動會材料&#xff0c;圍繞數據作為數字經濟時代核心生產要素的背景&#xff0c;結合國家戰略和集團數字化轉型需求&#xff0c;分析了當前數據資源整合不足、孤島現象嚴重、質量管控薄弱及共享機制不完善等問題&#xff0c;提出…

8.【線性代數】——求解Ax=b

八 求解Axb 1. 解Axb求特解 x p x_p xp?求特解 x n x_n xn?所有解 2. Axb什么時候有解3. A m ? n A_{m * n} Am?n?不同秩的Axb解分析3.1 列滿秩 rn<m3.2 行滿秩 rm<n3.3 rmn3.4 r<m 且 r < n3.5 綜述 1. 解Axb 求解 { x 1 2 x 2 2 x 3 2 x 4 b 1 2 x 1…

動靜態鏈接與加載

目錄 靜態鏈接 ELF加載與進程地址空間&#xff08;靜態鏈接&#xff09; 動態鏈接與動態庫加載 GOT表 靜態鏈接 對于多個.o文件在沒有鏈接之前互相是不知到對方存在的&#xff0c;也就是說這個.o文件中調用函數的的跳轉地址都會被設定為0&#xff08;當然這個函數是在其他.…

Web 后端 請求與響應

一 請求響應 1. 請求&#xff08;Request&#xff09; 客戶端向服務器發送的HTTP請求&#xff0c;通常包含以下內容&#xff1a; 請求行&#xff1a;HTTP方法&#xff08;GET/POST等&#xff09;、請求的URL、協議版本。 請求頭&#xff08;Headers&#xff09;&#xff1a;…

【Excel筆記_6】條件格式和自定義格式設置表中數值超過100保留1位,超過1000保留0位,低于100為默認

方法一&#xff1a;自定義格式 選中需要設置格式的單元格區域。右鍵選擇設置單元格格式&#xff0c;或者在工具欄中選擇開始 -> 數字 -> 自定義格式。在類型框中輸入以下自定義格式&#xff1a; [>1000]0;[>100]0.0;G/通用格式解釋&#xff1a; [>1000]0&…

排序與算法:希爾排序

執行效果 希爾排序的執行效果是這樣的&#xff1a; 呃……看不懂嗎&#xff1f;沒關系&#xff0c;接著往下看介紹 算法介紹 希爾排序算法&#xff08;Shell Sort&#xff09;是按其設計者希爾&#xff08;Donald Shell&#xff09;的名字命名&#xff0c;該算法由 1959 年公布…

Python HTTP 請求工具類 HttpUtils:簡化 HTTP 請求的高效工具

在現代的 Web 開發和 API 集成中,HTTP 請求是最常見的操作之一。無論是獲取數據、提交表單,還是與 RESTful API 交互,我們都需要頻繁地發送 HTTP 請求。為了簡化這些操作,提升代碼的可讀性和可維護性,我們可以使用一個高效的工具類——HttpUtils。本文將詳細介紹 HttpUtil…