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

 


Dernière réponse
Sujet : [C++] istream & flush
Joel F mais paye ta pelle d'or, le poste à *7* ans

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
Joel F mais paye ta pelle d'or, le poste à *7* ans
lutin_codeur_dm89 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:

tgrx Effectivement *Syl*, ca marche. Mais j'aimerais trouver une solution entierement C++ avec cin. J'aime pas trop mixer C et C++.
 
UP !
*syl* 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.
 
 ;)
minusplus 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).

tgrx Marche po... mon programme tourne indefiniment sur la boucle while
minusplus bon...
essaye while(cin.peek() != cin.eof());
 
 
(chuis désolé, j'aurais bien essayé avant, mais là, je peux pas...)
tgrx 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:
minusplus c'est quoi ta plateforme ?
minusplus

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>

tgrx Ben non desole.
 
eric@vsl155:/usr/include/g++ > more * | grep "traits_type"
eric@vsl155:/usr/include/g++ >
minusplus ben c'est dans

Code :
  1. <string>

normalement

tgrx impossible de trouver traits_type. j'ai parcouru tous les headers, je vois pas ou ca peut etre.
 
UP du matin !
tgrx minusplus> oui. je vais essayer.
minusplus Je préfère ma solution :
 

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

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

tgrx 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]

minusplus 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.
*syl*

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:

minusplus 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...
*syl* 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
minusplus 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().

tgrx 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...
minusplus tu peux pas faire un cin.ignore(numeric_limits<int>::max()) avant puis poser ta question puis faire un getline ?
tgrx Accepte par le compilo, mais ca ne change rien au probleme... :cry:
Amadeus t'as essayé cin.clear() ?
tgrx UP !
tgrx UP !
tgrx 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...
BENB 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 ?
tgrx 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.

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