国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現

這篇具有很好參考價值的文章主要介紹了《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

??作者: 主頁

我的專欄
C語言從0到1
探秘C++
數據結構從0到1
探秘Linux
菜鳥刷題集

??歡迎關注:??點贊??收藏??留言

??碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?!

前言

前面幾章我們講述了Linux指令、權限管理、編輯器、編譯器、軟件包管理器、自動化管理工具,也寫了簡單的”Hello World“程序,但是沒有實現過復雜一點的程序,光說不練假把式,今天就帶大家來做一個小項目–進度條。

搭建框架

在寫代碼之前,我們先把文件先建好。

vim main.c
vim process.c
vim process.h
vim makefile

書寫代碼

在寫代碼要先講一個知識點。

1.回車換行
在我們日常使用回車鍵時,是否注意到,當我們按下回車鍵,也就是\n,光標就會換到第二行的開始,其實這里面有兩個動作,換行和把光標設置到行開始,在C語言中可用\r來把光標換到開始位置
我們來借此寫個小demo:倒計時

void download()
{
	int cnt=10;
	while(cnt!=0)
	{
		printf("%-2d\r",cnt);
		fflush(stdout);
		cnt--;
		sleep(1);
	}
	printf("\n");
}

效果如下:
《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現,《探秘Linux》,linux,小程序,運維,服務器,開發(fā)語言

第一版

我們最終要實現這個效果:
《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現,《探秘Linux》,linux,小程序,運維,服務器,開發(fā)語言
我們前面講了\r可以把光標移到行始,所以在我們輸出緩存字符的時候,每一次都移到一開始的位置,隨著緩存字符的增多,來實現進度條的效果。
代碼如下:
process.c

#include"process.h"                                                                                                            
const char *lable="|/-\\";//通過循環(huán)實現一個轉動的效果                                                                                                     
char bar[NUM];                                                                                                                 
                                                                                                                               
void download(int speed)                                                                                                       
{                                                                                                                              
    char bar[NUM];//使用數組來存儲”緩存字符“                                                                                                             
    memset(bar,'\0',sizeof(bar));//初始化                                                                                              
    int len =strlen(lable);                                                                                                    
    int cnt=0;                                                                                                                 
    while(cnt<=TOP)//設置終止條件                                                                                                            
    {                                                                                                                          
       printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);
       //%-100s:預留100個空間左對齊
       //%%:輸出%,也可以使用\%
       //\r:把光標移到開始位置                                                               
       fflush(stdout);//清空緩存區(qū)                                                                                                         
       bar[cnt++]=BODY;//將cnt所在位置設置為”BODY"                                                                                                        
       if(cnt<100)bar[cnt]=RIGHT;//設置>                                                                                              
       usleep(speed);//控制進度條的速度,單位是微秒                                                                                                      
    }                                                                                                                          
    printf("\n");                                                                                                              
}               

main.c

#include "process.h"

int main() 
{
    download(100000);
    return 0; 
}

process.h

#pragma once
#include<stdio.h>
#include <unistd.h>
#include<string.h>

#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'

extern void download(int speed);

makefile

process:process.c main.c  
    gcc -o $@ $^                                                                                                               
  
.PHONY:clean  
  
clean:   
    rm -f process   

通過注釋,應該可以清楚明白代碼的實現原理,但是進度條該怎么用呢?這是一個問題,下面我們來模擬一下使用場景,只需要再修改一下代碼即可。

第二版

參考代碼注釋理解

main.c

#include "processBar.h"


typedef void (*callback_t)(int); // 函數指針類型

// 模擬一種安裝或者下載
void downLoad(callback_t cb)
{
    int total = 1000; // 1000MB
    int curr = 0;     // 0MB
    while(curr <= total)
    {
        // 模擬進行著某種下載的任務, 我
        usleep(50000);  // 模擬下載花費的時間
        int rate = curr*100/total; // 更新進度

        cb(rate); // 通過回調,展示進度

        curr += 10;     // 循環(huán)下載了一部分
    }
    printf("\n");
}

int main()
{
    printf("donwnload 1: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 2: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 3: \n");
    downLoad(processbar);
    initbar();
    printf("donwnload 4: \n");
    downLoad(processbar);
    initbar();
    return 0;
}

processBar.h

#pragma once

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <unistd.h>

#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'


extern void processbar(int rate);
extern void initbar();

processBar.c

#include "processBar.h"


const char *lable="|/-\\";
char bar[NUM];

// 是如何被調用的
void processbar(int rate)
{
    if(rate < 0 || rate > 100) return;

    int len = strlen(lable);
    printf("[%-100s]""[%d%%][%c]\r", bar, rate, lable[rate%len]); // 沒有\(zhòng)n,就沒有立即刷新,因為顯示器模式是行刷新
    fflush(stdout);
    bar[rate++] = BODY;
    if(rate < 100) bar[rate] = RIGHT;
}

void initbar()
{
    memset(bar, '\0', sizeof(bar));
}

makefile

processbar:processBar.c main.c
	gcc -o $@ $^
.PHONY:clean
clean:
	rm -f processbar

效果是一樣的,看到這里,我相信你對實現一個進度條已經非常了解了,但是有沒有覺得它有點不好看,那么我們再來優(yōu)化一下。

第三版

怎么修改?這里要了解一下怎么讓編譯器輸出顏色,可參考這篇文章
http://t.csdn.cn/O2T8F

只需修改processBar.c文件即可

如下:

#include "processBar.h"


const char *lable="|/-\\";
char bar[NUM];

// 是如何被調用的
void processbar(int rate)
{
    if(rate < 0 || rate > 100) return;

    int len = strlen(lable);
    printf("\033[38;2;128;0;128m\033[48;2;255;255;255m[%-100s][%d%%][%c]\033[m\r", bar, rate, lable[rate % len]);
    fflush(stdout);
    bar[rate++] = BODY;
    if(rate < 100) bar[rate] = RIGHT;
}

void initbar()
{
    memset(bar, '\0', sizeof(bar));
}

效果如下:
《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現,《探秘Linux》,linux,小程序,運維,服務器,開發(fā)語言

后記

本篇我們講述了如何在Linux上實現一個進度條,并對其進行了美化,但是我們的目的是通過做項目來把之前所學的相關知識串起來,我并沒有對它進行過多的講解,因為它本身并不難,難的是你在linux系統(tǒng)上編程的過程,但它也是最重要的!文章來源地址http://www.zghlxwxcb.cn/news/detail-627648.html

到了這里,關于《Linux從練氣到飛升》No.07 Linux第一個小程序-進度條的實現的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 《Linux從練氣到飛升》No.02 Linux權限管理

    《Linux從練氣到飛升》No.02 Linux權限管理

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?! 在講述Linux權限管理之前,我們要了解什么是權限

    2024年02月14日
    瀏覽(40)
  • 《Linux從練氣到飛升》No.12 Linux進程概念

    《Linux從練氣到飛升》No.12 Linux進程概念

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?! 本篇我們將正式進入Linux的世界,首先先要講的就

    2024年02月13日
    瀏覽(13)
  • 《Linux從練氣到飛升》No.20 Linux進程替換

    ???作者:?主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊

    2024年02月10日
    瀏覽(26)
  • 《Linux從練氣到飛升》No.01 Linux常用指令

    《Linux從練氣到飛升》No.01 Linux常用指令

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?! 當涉及到Linux系統(tǒng)管理和開發(fā),了解常見的Linux指

    2024年02月14日
    瀏覽(23)
  • 《Linux從練氣到飛升》No.13 Linux進程狀態(tài)

    《Linux從練氣到飛升》No.13 Linux進程狀態(tài)

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。。?前面我們講述了進程的基本概念以及如何描述、組

    2024年02月12日
    瀏覽(17)
  • 《Linux從練氣到飛升》No.15 Linux 環(huán)境變量

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀!!!

    2024年02月12日
    瀏覽(24)
  • 《Linux從練氣到飛升》No.16 Linux 進程地址空間

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?!

    2024年02月12日
    瀏覽(20)
  • 《Linux從練氣到飛升》No.24 Linux中的信號

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀!??!

    2024年02月08日
    瀏覽(19)
  • 《Linux從練氣到飛升》No.23 Linux 進程間通信

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。。?/p>

    2024年02月08日
    瀏覽(18)
  • 《Linux從練氣到飛升》No.22 Linux 基礎IO

    ??作者: 主頁 我的專欄 C語言從0到1 探秘C++ 數據結構從0到1 探秘Linux 菜鳥刷題集 ??歡迎關注:??點贊??收藏??留言 ?? 碼字不易,你的??點贊??收藏??關注對我真的很重要,有問題可在評論區(qū)提出,感謝閱讀?。?!

    2024年02月07日
    瀏覽(21)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包