Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4799 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] istream & flush

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] istream & flush

n°33397
tgrx
My heart is pumping for love
Posté le 21-05-2001 à 11:33:06  profilanswer
 

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.

mood
Publicité
Posté le 21-05-2001 à 11:33:06  profilanswer
 

n°33427
BENB
100% Lux.
Posté le 21-05-2001 à 13:54:15  profilanswer
 

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 ?

n°33439
tgrx
My heart is pumping for love
Posté le 21-05-2001 à 14:11:43  profilanswer
 

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...

n°33482
tgrx
My heart is pumping for love
Posté le 21-05-2001 à 15:44:25  profilanswer
 

UP !

n°33621
tgrx
My heart is pumping for love
Posté le 22-05-2001 à 09:32:02  profilanswer
 

UP !

n°33635
Amadeus
Posté le 22-05-2001 à 09:59:21  profilanswer
 

t'as essayé cin.clear() ?

n°33651
tgrx
My heart is pumping for love
Posté le 22-05-2001 à 10:53:42  profilanswer
 

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

n°33821
minusplus
Posté le 22-05-2001 à 16:50:28  profilanswer
 

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

n°33823
tgrx
My heart is pumping for love
Posté le 22-05-2001 à 16:55:58  profilanswer
 

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...

n°33829
minusplus
Posté le 22-05-2001 à 17:13:43  profilanswer
 

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().

mood
Publicité
Posté le 22-05-2001 à 17:13:43  profilanswer
 

n°33833
*syl*
--&gt; []
Posté le 22-05-2001 à 17:30:16  profilanswer
 

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

n°33834
minusplus
Posté le 22-05-2001 à 17:32:17  profilanswer
 

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...

n°33835
*syl*
--&gt; []
Posté le 22-05-2001 à 17:38:11  profilanswer
 

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:

n°33837
minusplus
Posté le 22-05-2001 à 17:47:51  profilanswer
 

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.

n°33841
tgrx
My heart is pumping for love
Posté le 22-05-2001 à 17:58:50  profilanswer
 

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]

n°33844
minusplus
Posté le 22-05-2001 à 18:10:38  profilanswer
 

Je préfère ma solution :
 

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

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

n°33845
tgrx
My heart is pumping for love
Posté le 22-05-2001 à 18:12:38  profilanswer
 

minusplus> oui. je vais essayer.

n°33951
tgrx
My heart is pumping for love
Posté le 23-05-2001 à 10:24:30  profilanswer
 

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

n°33968
minusplus
Posté le 23-05-2001 à 11:04:53  profilanswer
 

ben c'est dans

Code :
  1. <string>

normalement

n°33969
tgrx
My heart is pumping for love
Posté le 23-05-2001 à 11:12:56  profilanswer
 

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

n°33971
minusplus
Posté le 23-05-2001 à 11:26:42  profilanswer
 

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>

n°33972
minusplus
Posté le 23-05-2001 à 11:27:31  profilanswer
 

c'est quoi ta plateforme ?

n°33982
tgrx
My heart is pumping for love
Posté le 23-05-2001 à 12:07:43  profilanswer
 

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:

n°33994
minusplus
Posté le 23-05-2001 à 12:44:09  profilanswer
 

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

n°34007
tgrx
My heart is pumping for love
Posté le 23-05-2001 à 13:30:13  profilanswer
 

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

n°34038
minusplus
Posté le 23-05-2001 à 14:27:15  profilanswer
 

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).

n°34127
*syl*
--&gt; []
Posté le 23-05-2001 à 16:46:26  profilanswer
 

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.
 
 ;)

n°34227
tgrx
My heart is pumping for love
Posté le 24-05-2001 à 16:10:33  profilanswer
 

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

n°1724736
lutin_code​ur_dm89
g33k-&gt;setfriend(Murphy_Rache);
Posté le 25-04-2008 à 21:41:02  profilanswer
 

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);*/ }
n°1724743
Joel F
Real men use unique_ptr
Posté le 25-04-2008 à 21:56:08  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] istream & flush

 

Sujets relatifs
Plus de sujets relatifs à : [C++] istream & flush


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)