IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

cout: Problème de retour chariot


Sujet :

C++

  1. #1
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut cout: Problème de retour chariot
    Bonjour,

    J'ai un code qui tourne sur un grand nombre d'éléments, et pendant qu'il tourne j'aimerais afficher une ligne du type "Elément XXXX", avec XXXX le numéro de l'élément, qui se mettrait à jour tous les 1000 éléments.

    J'ai donc quelque chose du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for(int i=0; i<allentries; i++){
         if(! i%1000) cout << "\rElément " << i;
     
         // Plein de choses longues et compliquées
    }
    Ça a l'air tout bête mais ça ne marche pas! Il n'y a rien qui s'affiche du tout, et quand je quitte le programme (ctrl+c), juste avant de quitter il imprime "Elément 89000" (par exemple).

    J'ai essayé de varier la vitesse d'actualisation:
    - tous les éléments, ça marche mais ça ralentit fortement le programme
    - tous les 10 éléments, idem
    - tous les 100 éléments, ça marche à moitié: il actualise la ligne aléatoirement, de manière saccadée (le numéro est bien un multiple de 100, mais il en "loupe" un certain nombre)

    Je précise qu'il n'y a aucun soucis lorsque je remplace la ligne en question par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(! i%1000) cout << "Elément " << i << endl;
    Quand je fais un code-bidon avec juste un boucle et cette ligne, ça marche quand la boucle ne contient rien d'autre, mais le même problème apparaît quand j'ajoute un simple sleep(1).

    J'ai longuement cherché sur le net quelqu'un qui aurait le même soucis, sans succès.

    Une idée?

  2. #2
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Salut.
    Je suppose que l'operateur not (!) ne fonctionne pas pour ce que tu veux...
    voici un code qui fonctionne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(int i=1; i<100; i++)
    {
        if(i%10 == 0) cout<<"multiple:"<<i<<endl;
    }

  3. #3
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut
    Merci pour ta réponse, mais j'ai l'impression que tu n'as pas saisi mon problème (je n'ai peut être pas été assez clair)...

    Le problème est le retour du curseur au début de la ligne (le "\r") qui ne fonctionne pas comme il devrait.

    La condition avec le NOT fonctionne puisque tout se passe parfaitement lorsque j'enlève le "\r" et que j'ajoute "<< endl" à la fin de la ligne. J'obtiens alors:
    Elément 0
    Elément 1000
    Elément 2000
    etc...
    De plus, comme je disais, ça fonctionne quand l'intervalle de 1000 est remplacé par 10.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Bonsoir,

    Je ne comprend pas bien cette histoire d’élément sauté, ça affiche par exemple 100 puis 300 ou simplement 100, 200, 300 d'un coup ?
    Dans le premier cas je vais dire que i ne passe pas par 200 et dans le second c'est normal.

    Dans l'implémentation et l'utilisation normale des buffers (streambuf) des flux, ces derniers n'envoies pas le contenu si:
    - ce n'est pas demandé explicitement
    - il reste de la place dans le buffer

    Comme un nombre de quelques caractères est très petit, le buffer ne se remplit pas très vite et l'affichage est d'autant différé.

    Au contraire, l'utilisation de std::endl à 2 effets, le premier est d'ajouter un saut de ligne, le second de faire un flush.
    Le flush permet de dire explicitement au buffer d'écrire sur le device (ici, la console).

    Si tu ne veux pas faire de endl à cause du saut de ligne, fait juste un flush.

    EDIT avant postage ^^: effectivement, le if est faussé (même pas fait gaffe). Le point d'exclamation est prioritaire au module il aurait mettre des parenthèses ou faire comme indiqué par SkyZoThreaD. Le reste est cependant vrai alors je poste quand même.

  5. #5
    Membre confirmé

    Profil pro
    Étudiant
    Inscrit en
    Janvier 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2007
    Messages : 72
    Par défaut
    Le cout.flush() résoud le problème, merci beaucoup!

    Je prends acte pour le "if" (pourtant ça fonctionne...?!).
    => En fait j'avais bien mis des parenthèses dans mon code, mais oublié de les mettre ici...

    (pour répondre à ta question, ça affichait par exemple 100 puis 2400, puis 8200, etc. Or i passe bien par toutes les valeurs)

  6. #6
    Membre émérite Avatar de SkyZoThreaD
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juillet 2013
    Messages
    585
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Juillet 2013
    Messages : 585
    Par défaut
    Si ! Tu étais plutôt clair... c'est moi qui ai lu en diagonale sorry

Discussions similaires

  1. problème de retour chariot
    Par gmandil dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 06/02/2007, 12h01
  2. problème de retour chariot!
    Par jguep dans le forum C
    Réponses: 2
    Dernier message: 03/12/2006, 15h16
  3. [SQL Loader] problème de retour chariot
    Par euphorix dans le forum SQL
    Réponses: 3
    Dernier message: 31/08/2006, 05h37
  4. Problème de Retour Chariot
    Par AyreoN dans le forum Langage
    Réponses: 1
    Dernier message: 30/05/2006, 11h00
  5. [Struts] Problème de retour chariot
    Par pimousse76 dans le forum Struts 1
    Réponses: 5
    Dernier message: 22/11/2004, 15h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo