У меня есть эта функция:

void choiceTwo(void){

    system("clear");
    printf("================ RUN ALL FUNCTION ================\n\n");

    printf("\nTest case 'create/destroy'... ");
    fflush(stdout);
    test_create_destroy();
    printf("OK\n");

    printf("Test case 'add/remove edge'... ");
    fflush(stdout);
    test_add_remove_edge();
    printf("OK\n");

    printf("Test case 'print graph'... ");
    fflush(stdout);
    test_print_graph();
    printf("OK\n");

    printf("Test case 'null'... ");
    fflush(stdout);
    test_null();
    printf("OK\n");

    printf("\nPress enter to continue ");
    getchar();
    getchar();
    main();
}

Как я могу напечатать статус этой функции, используя индикатор выполнения (в процентах), как это показано на рисунке?

Статус бар

Я пытался сделать это с помощью Python, но не знаю, как полностью контролировать состояние функции

0
nomeNano 2 Апр 2017 в 21:49

2 ответа

Лучший ответ

Попробуй этот код

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

void working ( int showat, int done, int total) {
    char dash[51]  = "--------------------------------------------------";
    char blank[51] = "                                                  ";
    int portion = 0;
    float percent = 0.0f;

    printf ( "\033[?25l");//hide cursor
    printf ( "\033[38;5;10m");//green text
    printf ( "\033[48;5;0m");//on black
    printf ( "\033[%d;H", showat);//move curson to line showat
    percent = ( (float)done * 100) / total;
    portion = percent / 2.0f;
    printf ( "Progress: [\033[38;5;0m\033[48;5;10m");//black text on green
    printf ( "%.*s\033[38;5;10m\033[48;5;0m%.*s]%6.1f%% Complete\r"//back to green text on black
    , portion, blank, 50 - portion, dash, percent);

    printf ( "\033[0m");//reset color
    printf ( "\033[?25h");//show cursor
}

void test_progress ( ) {
    int item = 0;
    int allitems = 200;
    //do things in functioin where you need to show progress
    for ( item = 0; item <= allitems; item++) {
        working ( 5, item, allitems);
        usleep ( 50000);
    }
}

void test_loop ( ) {
    int item = 0;
    int allitems = 500;
    //do things in functioin where you need to show progress
    for ( item = 0; item <= allitems; item++) {
        working ( 9, item, allitems);
        usleep ( 50000);
    }
}

void choiceTwo(void){

    printf ( "\033[2J");//clear screen
    printf ( "\033[0;H");//move curson to line 0
    printf("================ RUN PROGRESS TEST ================\n\n");

    printf("\nTest progress'... ");
    test_progress();
    printf("\nOK\n");


    printf("\nTest loop'... ");
    test_loop();
    printf("\nOK\n");

}

int main()
{
    choiceTwo ( );
    return 0;
}
0
xing 3 Апр 2017 в 20:41

Поле точности %.precision позволит вам напечатать определенное количество символов. Звездочка позволит использовать переменную. %.*s напечатает done количество символов из массива x, затем 50 - done символов из массива dash.
Использование возврата каретки \r должно продолжать печатать цикл в той же строке, что и цикл.

#include <stdio.h>

int main()
{
    int loop = 1;
    int done = 0;
    int end = 200000;
    char dash[51] = "--------------------------------------------------";
    char x[51] =    "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    float percent = 0.0f;
    while ( loop <= end) {
        percent = ( (float)loop * 100) / end;
        done = percent / 2.0f;
        printf ( "Progress: [%.*s%.*s]%6.1f%% Complete\r", done, x, 50 - done, dash, percent);
        loop++;
    }
    printf ( "\n");
    return 0;
}

Если ваш терминал поддерживает escape-коды, это можно использовать для достижения цветов, указанных на изображении.

#include <stdio.h>

int main()
{
    int loop = 1;
    int done = 0;
    int end = 200000;
    char dash[51]  = "--------------------------------------------------";
    char blank[51] = "                                                  ";
    float percent = 0.0f;
    printf ( "\033[?25l");//hide cursor
    printf ( "\033[38;5;10m");//green text
    printf ( "\033[48;5;0m");//on black
    while ( loop <= end) {
        percent = ( (float)loop * 100) / end;
        done = percent / 2.0f;
        printf ( "Progress: [\033[38;5;0m\033[48;5;10m");//black text on green
        printf ( "%.*s\033[38;5;10m\033[48;5;0m%.*s]%6.1f%% Complete\r"//back to green text on black
        , done, blank, 50 - done, dash, percent);
        loop++;
    }
    printf ( "\033[0m");//reset color
    printf ( "\033[?25h");//show cursor
    printf ( "\n");
    return 0;
}

Это оборачивает прогресс в функции. Вызовите эту функцию с линией, на которой вы хотите отобразить панель (от 0 до 23), с уже выполненными и суммарными элементами.

#include <stdio.h>

void working ( int showat, int done, int total) {
    char dash[51]  = "--------------------------------------------------";
    char blank[51] = "                                                  ";
    int portion = 0;
    float percent = 0.0f;

    printf ( "\033[?25l");//hide cursor
    printf ( "\033[38;5;10m");//green text
    printf ( "\033[48;5;0m");//on black
    printf ( "\033[%d;H", showat);//move curson to line showat
    percent = ( (float)done * 100) / total;
    portion = percent / 2.0f;
    printf ( "Progress: [\033[38;5;0m\033[48;5;10m");//black text on green
    printf ( "%.*s\033[38;5;10m\033[48;5;0m%.*s]%6.1f%% Complete\r"//back to green text on black
    , portion, blank, 50 - portion, dash, percent);

    printf ( "\033[0m");//reset color
    printf ( "\033[?25h");//show cursor
}

int main()
{
    int loop = 1;
    int end  = 20000;
    while ( loop <= end) {
        working ( 23, loop, end);
        loop++;
    }
    printf ( "\n");
    return 0;
}
1
xing 3 Апр 2017 в 18:27