Faire un flush en C++

Faire un flush en C++ - C++ - Programmation

Marsh Posté le 26-06-2004 à 17:21:15    

Salut,
 
J'ai un problème idiot, mais vu que je n'ai pas trouvé de solution sur google ni ici (la recherche efficace et moi, ça a toujours fait deux :sweat: ), j'expose mon problème ici.
 
J'ai deux variables de type string : editeur et console.
J'invite l'utilisateur à saisir ces deux chaines. Cependant, si l'éditeur est un mot séparé par un espace (exemple : "Ubi Soft" ), le programme retourne :
editeur = "Ubi"
console = "Soft"
Il saute donc la seconde saisie.
 
J'ai vu sur des forums des solutions du style :

Code :
  1. cout << "Message" << flush;
  2. cin.clear();
  3. cin >> truc;


 
mais ça n'a pas corrigé mon problème : j'ai été obligé de passer par un fflush(stdin) tel qu'on le ferait en C (et encore, cette méthode est déconseillée, je crois).
 
Ce qui donne donc :

Code :
  1. cout << "Entrez un editeur : \n";
  2. fflush(stdin);
  3. cin >> editeur;
  4. cout << "Entrez la nouvelle console : \n";
  5. fflush(stdin);
  6. cin >> console;


 
Quelqu'un pourrait-il me dire quelle serait la meilleure syntaxe pour rester dans une optique purement C++ ?


Message édité par monsieur tomate le 26-06-2004 à 20:10:51
Reply

Marsh Posté le 26-06-2004 à 17:21:15   

Reply

Marsh Posté le 26-06-2004 à 17:26:14    

1) ne mélange pas stdio et stream
 
2) std::flush fonctionne. ton cin.clear() est a priori inutile
 
3) un '\n' + suivi d'un flush -> le flush est inutile
 
4) il faut flusher entre tout cout non terminé par un '\n' et un cin
 
5) tu n'a pas de problème de flush. utilise std::getline(std::cin, a_std_string) qui lit une ligne

Reply

Marsh Posté le 26-06-2004 à 17:48:07    

J'ai essayé :
 

Code :
  1. cout << "Entrez un editeur : \n";
  2. getline(cin,editeur);
  3.  
  4. cout << "Entrez la nouvelle console : \n";
  5. getline(cin,console);


 
Lorsque je ne fais que lire des chaînes, ça semble ok. Par contre, si je mélange des saisies avec des nombres (cin >> variable;) et des saisies avec des chaînes, le résultat est vraiment bizarre...
Pourtant, je respecte bien mes '\n' à la fin des cout... :o

Reply

Marsh Posté le 26-06-2004 à 17:52:15    

ou mets des flush. et il n'y a rien de bizarre, tu dois juste merdoyer quelque part

Reply

Marsh Posté le 26-06-2004 à 18:56:17    

J'ai refait quelques essais et j'y vois un peu plus clair :
quand je suis dans mon programme principal, ça marche impeccable.
Par contre, quand j'utilise ce morceau de code à l'intérieur de ma classe, ça bugge toujours.
 
Voici ce qui marche dans mon programme principal :

Code :
  1. string editeur;
  2. cout << "Entrez un editeur : " << endl;
  3. getline(cin,  editeur);


 
Dans ma classe, editeur est un membre protégé. Je recopie le même code (sans la déclaration string editeur bien sûr) dans une des méthodes et là, ça ne marche pas du tout...

Reply

Marsh Posté le 26-06-2004 à 19:25:10    

c'est que tu foires ailleurs : note qu'endl == '\n' + flush alors si tu veux pas '\n', n'utilise que flush

Reply

Marsh Posté le 26-06-2004 à 20:01:47    

wow, j'ai réussi !
 
En effet, le problème venait d'ailleurs :)
J'ai dû modifier une fonction permettant une saisie numérique :
 

Code :
  1. cin >> nb;
  2. cin.ignore();


 
J'ai rajouté le cin.ignore() et hop, ça carbure ! :pt1cable:  
 
Merci pour tes éclaircissements, en tout cas

Reply

Marsh Posté le 26-06-2004 à 20:05:35    

écoute, plus tu rajoutes de choses sans comprendre plus tu accumules les merdes, certaines en annulant d'autres. si c'est le bordel sans ignore, c'est que quelque chose se passe mal sans que tu le saches. la programmation, c'est pas 'je bourre jusqu'à que ça passe sur mon test'
 
fais une recherche sur comment on lit proprement un entier, j'ai déjà collé des exemples de codes comme il faut.

Reply

Marsh Posté le 26-06-2004 à 20:07:11    

non c'est pas résolu

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed