[C++] istream & flush

 istream & flush [C++] - Programmation

Marsh Posté le 21-05-2001 à 11:33:06    

Tout le monde sait que pour vider le buffer d'un flux sortant on fait :
 
out << flush;
avec out un ostream
 
Je voudrais faire la meme chose avec un istream.
J'ai regarde les methodes de iostream.h, y a rien qui correspond ? Comment faire pour "flusher" un flux entrant ?
 
Merci.

Reply

Marsh Posté le 21-05-2001 à 11:33:06   

Reply

Marsh Posté le 21-05-2001 à 13:54:15    

Pourquoi flusher un flux entrant ?
Quel est le sens de ta question ?
Le but est-il de faire entrer des donnees dans un flux ou il n'y en a pas ?
flush sert a faire sortir les donnees du tampon du flux. Pour un flux en entree tu fais ca en lisant dans le flux, non ?

Reply

Marsh Posté le 21-05-2001 à 14:11:43    

C'est juste qu'au debut de mon programme, je fais un cin.getline(), pour que l'utilisateur entre une expression, et que bien souvent le flux cin n'est pas vide, et donc il remplit la chaine, valide le getline() et l'utilisateur ne peux pas intervenir.
 
Donc je voudrais savoir s'il y a un moyen d'initialiser le cin, ou de le vider, de maniere a avoir un flux entrant vierge a l'execution du programme...

Reply

Marsh Posté le 21-05-2001 à 15:44:25    

UP !

Reply

Marsh Posté le 22-05-2001 à 09:32:02    

UP !

Reply

Marsh Posté le 22-05-2001 à 09:59:21    

t'as essayé cin.clear() ?

Reply

Marsh Posté le 22-05-2001 à 10:53:42    

Accepte par le compilo, mais ca ne change rien au probleme... :cry:

Reply

Marsh Posté le 22-05-2001 à 16:50:28    

tu peux pas faire un cin.ignore(numeric_limits<int>::max()) avant puis poser ta question puis faire un getline ?

Reply

Marsh Posté le 22-05-2001 à 16:55:58    

effectivement ca supprime mon probleme, mais ca en ajoute un autre, car ensuite je tape ma ligne, et il ne se passe rien, cin est encore en train d'attendre...

Reply

Marsh Posté le 22-05-2001 à 17:13:43    

heu... cin envoie pas un eof quand le buffer est vide ?
 
Ah... tu dois pouvoir faire un boucle de peek, alors :
 

Code :
  1. int_type peek();
  2. The unformatted input function
  3. extracts an element, if possible, as if by returning
  4. rdbuf()->sgetc().
  5. Otherwise, it returns
  6. traits_type::eof().

Reply

Marsh Posté le 22-05-2001 à 17:13:43   

Reply

Marsh Posté le 22-05-2001 à 17:30:16    

Pour vider le buffer, utilise getchar() :
 
while(getchar() != '\n') ;
 
il me semble qu'on peut le faire aussi avec kbinit mais comme je l'ai jamais utilisé, j'en sais pas plus

Reply

Marsh Posté le 22-05-2001 à 17:32:17    

ben moi je ferais pas ça...
Il peut trés bien trainer un '/n' dans le buffer qui ne soit pas le dernier caractère...

Reply

Marsh Posté le 22-05-2001 à 17:38:11    

minusplus a écrit a écrit :

ben moi je ferais pas ça...
Il peut trés bien trainer un '/n' dans le buffer qui ne soit pas le dernier caractère...




ben moi quand j'avais des pb avec cin, j'utilisait ça et ca marchait niquel
 
On verra bien ce que tgrx dira... si ca marche ou pas ... :na:

Reply

Marsh Posté le 22-05-2001 à 17:47:51    

par exemple, si tu lances une applis quelconque dans un terminal (pas en tache de fond) et que tu tapes des lignes de commande, tu te retrouves, lorsque l'appli se termine avec un buffer qui contient des '/n' un peu partout. Si tu utilise peek au lieu de getchar, normalement, tu t'arrêtes sur un buffer vide.

Reply

Marsh Posté le 22-05-2001 à 17:58:50    

Merci a tous pour votre soutien :hello:
Mon programme actuel est ecrit comme ca :
 
char buffer[101];
do
  {
    cin.clear();
    cin.getline(buffer,100);
  }
while (!strlen(buffer));
 
... avec la condition sur le while pour virer les '\n' parasites en trop... ce qui revient a ta solution *syl*.
Mais j'aurais aime trouver qq chose de plus clean, qui utilise les methodes de classe de cin.

 

[edit]--Message édité par tgrx--[/edit]

Reply

Marsh Posté le 22-05-2001 à 18:10:38    

Je préfère ma solution :
 

Code :
  1. while(cin.peek() != traits_type::EOF);
 

[edit]--Message édité par minusplus--[/edit]

Reply

Marsh Posté le 22-05-2001 à 18:12:38    

minusplus> oui. je vais essayer.

Reply

Marsh Posté le 23-05-2001 à 10:24:30    

impossible de trouver traits_type. j'ai parcouru tous les headers, je vois pas ou ca peut etre.
 
UP du matin !

Reply

Marsh Posté le 23-05-2001 à 11:04:53    

ben c'est dans

Code :
  1. <string>

normalement

Reply

Marsh Posté le 23-05-2001 à 11:12:56    

Ben non desole.
 
eric@vsl155:/usr/include/g++ > more * | grep "traits_type"
eric@vsl155:/usr/include/g++ >

Reply

Marsh Posté le 23-05-2001 à 11:26:42    

Code :
  1. manu@BASSED6:/usr/include> grep -r "traits_" *
  2. g++-3/std/bastring.h:  typedef     traits               traits_type;
  3. manu@BASSED6:/usr/include-> grep -r "bastring.h" *
  4. g++-3/string:#include <std/bastring.h>
  5. manu@BASSED6:/usr/include>

Reply

Marsh Posté le 23-05-2001 à 11:27:31    

c'est quoi ta plateforme ?

Reply

Marsh Posté le 23-05-2001 à 12:07:43    

minusplus> :hello:
 
Effectivement j'ai bien trouve traits_type, dans std/straits.h, mais le pb est que la variable EOF n'existe pas. Le seul truc qui s'en rapproche, c'est la methode eos(), qui renvoie le caractere \0.
 
while (cin.peek() != string::traits_type::eos());
 
Mais ca ne resout pas mon probleme :cry:

Reply

Marsh Posté le 23-05-2001 à 12:44:09    

bon...
essaye while(cin.peek() != cin.eof());
 
 
(chuis désolé, j'aurais bien essayé avant, mais là, je peux pas...)

Reply

Marsh Posté le 23-05-2001 à 13:30:13    

Marche po... mon programme tourne indefiniment sur la boucle while

Reply

Marsh Posté le 23-05-2001 à 14:27:15    

désolé...
 
je serais curieux de savoir ce que renvoie cin lorsque son buffer est vide ?
 
ptêt avec getc comme le disait *syl* (mais alors sans tester '/n')

Citation :


int_type get();
basic_istream& get(char_type& ch);
basic_istream& get(char_type *str, streamsize count);
basic_istream& get(char_type *str, streamsize count,
    char_type delim);
basic_istream& get(basic_streambuf<Elem, Tr> *strbuf);
basic_istream& get(basic_streambuf<Elem, Tr> *strbuf,
    char_type delim);
The first of these  
unformatted input functions
extracts an element, if possible, as if by returning  
rdbuf()->sbumpc(). Otherwise, it returns  
traits_type::eof().  
If the function extracts no element, it calls  
setstate(failbit).

Reply

Marsh Posté le 23-05-2001 à 16:46:26    

voilà, j'ai un truc de mieux :
 
while(kbhit()) getchar() ;
 
kbhit() se trouve dans conio.h
proto : int kbhit(void) ;
 
Cette fonction permet de savoir si le tampon du clavier contient des caractères, elle renvoie une valeur différente de 0 si y'a des caractères sinon elle renvoie 0.
 
 ;)

Reply

Marsh Posté le 24-05-2001 à 16:10:33    

Effectivement *Syl*, ca marche. Mais j'aimerais trouver une solution entierement C++ avec cin. J'aime pas trop mixer C et C++.
 
UP !

Reply

Marsh Posté le 25-04-2008 à 21:41:02    

Hello les gens!
 
Il faut farfouiller dans les références un peu! ;)  
 
Même si le nom de la fonction ne nous saute pas tout de suite aux yeux, on peut remarquer sur ostream::flush() :

Citation :

Synchronizes the buffer associated with the stream to its controlled output sequence. This effectively means that all unwritten characters in the buffer are written to its controlled output sequence as soon as possible ("flushed" ).


 
Ce qui nous amène à aller regarder istream::sync() :  

Citation :

Synchronizes the buffer associated with the stream to its controlled input sequence. This effectively means that the unread characters in the buffer are discarded.


 

Code :
  1. cin.sync();


tout simplement ! :bounce:


---------------
while (myself->nb_projets_en_cours() > 0) { myself->wake_up(); myself->eat(); /* myself->work_projects(); */ myself->eat(); /* myself->sleep(); */ /* Sleep(ONE_DAY);*/ }
Reply

Marsh Posté le 25-04-2008 à 21:56:08    

mais paye ta pelle d'or, le poste à *7* ans

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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