2009-06-28 9 views
3

Je souhaite que mon programme affiche l'éolienne unix pendant le traitement. Il y a une boucle et à chaque itération Theres une fonction printf:Comportement étrange de stdout en C++

printf("Fetching articles (%c)\r",q); 

q est l'un des personnages dans le moulin à vent (- \ | /) en fonction du nombre d'itérations. Le problème est - il semble que dans 100 itérations, il n'y a que deux changements dans la ligne affichée, et chaque itération prend environ une seconde pour terminer.

Quel pourrait être l'aouse pour cela?

est ici la boucle entière avec seulement deux caractères possibles pour le moulin à vent:

for (int i=0;i<numb_articles;i++) { 
    memset(file_path,0x0,BUFF_SIZE); 

    url=article_urls[i]; 

    if (rules->print!=NO_PRINT) { 
    url=modify_url(url,rules->printout,rules->print); 
    if (url=="NULL") 
     continue; 
    } 

    get_page(url,file_content); 

    if (strcmp(rules->save.data(),"NULL")!=0) 
    if (!check_save(rules->save,file_content,url)) 
     continue; 

    at_least_one_saved=true; 
    numb_articles_accepted++; 

    encoding_list[i]=get_encoding(file_content); 

    title=get_title(file_content,err_msg); 

    if (title=="") 
    continue; 

    title_list[i]=strdup(title.data()); 
    filename=get_filename(title); 

    int count=numb_fn_found(filename_list,i,filename.data()); 
    char *tmp = new char[10]; 
    if (count>0) { 
    sprintf(tmp,"(%d)",count); 
    filename.insert((size_t)filename.length(),tmp); 
    } 

    filename_list[i]=strdup(filename.data()); 

    char q; 
    if (i%2==0) 
    q='|'; 
    else q='-'; 

    printf("Fetching articles (%c)\r",q); 

    ofstream output_file; 
    sprintf(file_path,TMP_FILE,filename.data()); 
    strncat(file_path,".html",5); 
    output_file.open(file_path); 

    output_file << file_content; 

    output_file.close(); 
} 

Répondre

9

Rincer la sortie après avoir écrit chaque ligne:

printf("Fetching articles (%c)\r",q); 
fflush(stdout); 

Sans cela, normalement stdout est dépotoirs tamponnées et seulement sa sortie quand un retour à la ligne est vu, ou son tampon interne se remplit.

+0

Merci, qui a travaillé je ne devais l'écrire comme ceci: printf ("\ r"); printf ("Récupération d'articles (% c)", q); fflush (stdout); –

+0

@Bartek, ah c'est ce qui a continué à me dérouter avec le \ r après le texte :) –

2

La sortie (console) est mise en mémoire tampon. C'est-à-dire qu'il n'écrit la sortie à l'écran que lorsque le tampon est plein ou qu'un retour à la ligne est écrit. Si vous voulez sortir les caractères un à la fois, vous devrez appeler fflush (stdout) explicitement pour vider le tampon de sortie.

Profitez,

Robert C. Cartaino

+0

Vous voudrez peut-être ajouter la partie sur le retour de chariot puisque c'est précisément le caractère en cours d'impression. –

+0

Fixé. J'ai également omis que, techniquement, un tampon complet ne se vide pas tant que vous n'essayez pas de l'écrire ... et quelques autres raisons diverses. –