2016-03-08 1 views
0

Je voudrais faire un indicateur de progression très basique en imprimant un caractère 'X' à cout chaque fois qu'une boucle progresse encore 10 % J'essaye de faire ceci comme montré dans le code collé ci-dessous, mais il ne semble pas fonctionner - quand vraiment il semble qu'il devrait.La conception d'une barre de progression simple à cout passe de 0-> 100% instantanément à la fin en C++

Il est censé afficher une progression régulière tout au long de la boucle, mais à la place, je reçois tous les X à la fois une fois la boucle terminée. Ce n'est pas parce que les boucles sont complétées trop rapidement pour que je puisse les percevoir. Pour vérifier cela, vous pouvez ajouter un «F» supplémentaire à «TOTAL» pour augmenter considérablement la durée de la boucle, et vous verrez que ce n'est pas seulement une question de perception.

Des idées sur ce qui pourrait en être la cause?

#include <iostream> 
#define TOTAL 0xFFFFFFF 
using namespace std; 

int main(void) { 

    //Make a counter for counting loops 
    double counter = 0; 
    // Set it to trigger after each 10% of progress 
    double counterMax = TOTAL/10; 

    cout << "Starting now..." << endl; 

    for (double i = 0; i < TOTAL; i++) { 
     // Do something... anything 
     i++; 
     i--; 
     // Increment the counter 
     counter++; 
     // Print an X when the counter exceeds the 10% 
     // trigger point, and then reset the counter. 
     if (counter > counterMax) { 
      cout << 'X'; 
      counter = 0; 
     } 
    } 
    cout << endl << "Done!"; 

    return 0; 
} 
+3

vous devez ajouter 'cout.flush();' 'après Cout << « X » ". –

+0

Alternativement, 'cout << 'X' << flush;' – AJNeufeld

+0

A fonctionné parfaitement. Merci à tous les deux! – Eddie

Répondre

2

Les appels système d'entrée/sortie sont généralement des opérations lentes. Pour augmenter l'efficacité des programmes, les flux d'entrée et de sortie sont souvent mis en mémoire tampon afin de réduire le nombre d'appels au système d'exploitation. Lorsqu'un programme a besoin d'une sortie "non-buffered", une solution consiste à utiliser les fonctions de sortie bufférisées, et à simplement "vider" la sortie pour garantir que le système d'exploitation traite toute sortie qui a été mise en file d'attente dans les buffers.

Lorsque le tampon de sortie est rempli ou lorsque le flux est fermé, il est automatiquement vidé. La sortie standard est également automatiquement vidée par certaines séquences, telles que endl. Mais vous pouvez déclencher une chasse d'eau de la sortie standard à tout moment en disant cout.flush() ou en utilisant le manipulateur flush, comme:

cout << 'X' << flush;