94 votes

Comment afficher un indicateur de progression en C / C ++ pur (cout / printf)?

J'écris un programme de console en C ++ pour télécharger un fichier volumineux. Je connais la taille du fichier et je lance un fil de travail à télécharger. Je veux montrer un indicateur de progression pour le rendre plus cool.

Comment afficher différentes chaînes à des moments différents, mais au même endroit, en mode cout ou printf?

118voto

leemes Points 17391

Avec une largeur fixe de votre sortie, utilisez quelque chose comme ce qui suit:

float progress = 0.0;
while (progress < 1.0) {
    int barWidth = 70;

    std::cout << "[";
    int pos = barWidth * progress;
    for (int i = 0; i < barWidth; ++i) {
        if (i < pos) std::cout << "=";
        else if (i == pos) std::cout << ">";
        else std::cout << " ";
    }
    std::cout << "] " << int(progress * 100.0) << " %\r";
    std::cout.flush();

    progress += 0.16; // for demonstration only
}
std::cout << std::endl;

http://ideone.com/Yg8NKj

[>                                                                     ] 0 %
[===========>                                                          ] 15 %
[======================>                                               ] 31 %
[=================================>                                    ] 47 %
[============================================>                         ] 63 %
[========================================================>             ] 80 %
[===================================================================>  ] 96 %

Notez que cette sortie est affichée sur une ligne au-dessous les uns des autres, mais dans un émulateur de terminal (je pense aussi en ligne de commande de Windows), il sera imprimé sur la même ligne.

À la fin, n'oubliez pas d'imprimer un retour à la ligne avant de l'imprimer plus de choses.

Si vous souhaitez supprimer de la barre à la fin, vous devez le remplacer avec des espaces, pour imprimer quelque chose de plus court, comme par exemple "Done.".

Aussi, la même chose peut bien sûr être fait à l'aide de printf C; adapter le code ci-dessus devrait être straight-forward.

61voto

James Curran Points 55356

Vous pouvez utiliser un "retour chariot" (\ r) sans saut de ligne (\ n) et espérer que votre console prend les bonnes décisions.

14voto

John Bandela Points 1495

Jetez un coup d'œil à boost progress_display

http://www.boost.org/doc/libs/1_52_0/libs/timer/doc/original_timer.html#Class%20progress_display

Je pense que cela peut faire ce dont vous avez besoin et je crois que c'est une bibliothèque en-tête seulement, donc rien à relier

12voto

Matt Kline Points 3962

Vous pouvez imprimer un caractère de retour chariot ( \r ) pour déplacer le "curseur" de sortie au début de la ligne en cours.

Pour une approche plus sophistiquée, jetez un œil à quelque chose comme ncurses (une API pour les interfaces textuelles de la console).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X