Forum Programmation.c++ Mettre a jours une ligne (barre de progression console etc ...)

Posté par  .
Étiquettes : aucune
0
25
avr.
2005
Bonjours tout le monde
J'uttilise C++ pour de la simulation ou du traitement de donnee , et n'uttilise pas de GUI ( la visualisation du resultat se fait a part ) par contre les temps d'executions sont plutot long.
J'aime bien avoir neamoins un moyen pour controler le bon deroulement du programme
Ce que j'uttilise pour l'instant c'est un bon vieux
if (iteration%N==0)
cout << iteration << endl;

J'aimerais pouvoir remettre a jours la ligne toute seule
et reecrire le Numero de l'iteration par dessus le precedent .

Ou alors faire une barre de progression ou autre chose dans ce genre .

Est ce qu'il y a un moyen simple de le faire sans uttiliser des librairies supplementaires ?

Est ce que ca s'applique aussi aux flux en general ?

Merci
  • # Re: Mettre a jours une ligne (barre de progression console etc ...)

    Posté par  . Évalué à 1.

    <BIG FAT WARNING>Je ne suis pas développeur, je n'y connais quasiment rien en programmation C/C++. L'informatique c'est pas mon métier.</BIG FAT WARNING>

    « J'aimerais pouvoir remettre a jours la ligne toute seule
    et reecrire le Numero de l'iteration par dessus le precedent. »


    Avec des retours chariot peut-être ? En bash cela donne ceci :

    #! /bin/sh
    for i in `seq 1 10` ; do
       let $[ p = ( 10 * ${i} ) ]
       echo -ne "\rProgression ${p}%\r"
       sleep 1
    done
    echo -e "\nTerminé."

    C'est ce que je fais pour mes scripts.
  • # \r

    Posté par  (site web personnel) . Évalué à 4.

    Il faut utiliser le caractère "\r" qui fait revenir le curseur au début de la ligne. Pour un exemple de barre de progression tu peux aller voir le code de wget par exemple. Où utiliser ça (pas testé, mais ça compile):
    typedef struct {
            int width;
            FILE *stream;
            char *bar;
    } progress_bar;
    
    progress_bar *init_progress_bar(FILE *stream, int width) {
            progress_bar *res;
            res = malloc(sizeof(progress_bar));
            res->stream = stream;
            res->bar = malloc(sizeof(char)*(width+1));
            res->width = width;
    
            memset(res->bar, ' ', width);
            res->bar[width] = '\0';
            fprintf(res->stream, "|");
            fprintf(res->stream, res->bar);
            fprintf(res->stream, "|\r|");
            memset(res->bar, '=', width);
            return res;
    }
    
    void update_progress_bar(progress_bar *bar, int progress) {
            bar->bar[progress] = '\0';
            fprintf(bar->stream, bar->bar);
            bar->bar[progress] = '=';
    }
    
    void free_progress_bar(progress_bar *bar) {
            free(bar->bar);
            free(bar);
    }
    
    Si tu reprends ça, oublie pas d'ajouter les vérifications d'usage au début de chaque fonction (buffer overflow, toussa).

    pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.