天天看點

linux下實作進度條小程式

轉載自: 實作一個簡單的進度條

我們平常總會在下載下傳東西或者安裝軟體的時候看到進度條,這裡我們就在linux下實作這個進度條的功能。

1、我們使用的關鍵列印語句是printf函數:

printf("[%-100s] [%d]%% [%c]\r");           

其中,'-'表示左對齊 100表示列寬,'\r'表示回車,即每

次列印完使光标回到行首。這樣在列印的時候就不會出現列印很多行的情況。

在這裡需要解釋一下'\r'和'\n'這兩個概念:

回車:'\r',表示回到目前行的行首

換行:'\n',表示光标進入下一行

2、加入睡眠時間,否則結果一下子就全部列印出來了,就不是進度條了。

通過man指令我們可以找到sleep和usleep函數。前面延時機關為秒,後置延時機關為微秒,我們這裡選擇後者。

3、手動重新整理緩沖區

現在來看一下UNIX裡面關于标準IO的幾種緩沖機制:

<1>全緩沖:指的是系統在填滿标準IO緩沖區之後,才進行實際的IO操作

;磁盤上的檔案通常由标準IO庫實施全緩沖

<2>行緩沖:标準IO在輸入輸出時遇到換行符(\n)的時候才将緩沖區的内容

寫入到标準輸入輸出的磁盤檔案。注意:當流涉及到終端時

通常使用的是行緩沖

<3>無緩沖:指的是标準IO庫不對字元進行緩沖存儲,

注意:标準出錯流stderr通常是無緩沖。

printf函數是一個行緩沖的函數,它會将結果先寫到緩沖區,然後滿足一定的條件才會重新整理到對應的檔案中,是以我們看到列印出來的結果是一段一段的,而不是一個一個字元的列印出來,這就是因為行緩沖的原因。

那麼我們就有必要使得每列印一個字元重新整理到對應的檔案中,怎麼做呢?

首先我們看下有哪些條件可以重新整理緩沖區:

(1)緩沖區已滿;

(2)遇到\n;

(3)調用ffush手動重新整理緩沖區;

(4)調用scanf()從緩沖區讀取資料時,也會将緩沖區的資料重新整理;

這裡我們使用fflush來手動重新整理緩沖區。

代碼如下:

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

int main()
{
    int rate = 0;
    char buf[101] = {0};
    const char arr[4] = {'-', '\\', '|', '/'}; // 注意:'\'字元的表示
    while( rate <= 100 )
    {
        buf[rate] = '#';
        printf("[%-100s] [%d]%% [%c]\r", buf, rate, arr[rate%4]);
        fflush(stdout);
        rate++;
        usleep(100000);
    }  
    return 0;
}           

效果圖如下:

linux下實作進度條小程式

繼續閱讀