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 :
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.
eric@vsl155:/usr/include/g++ > more * | grep "traits_type"
eric@vsl155:/usr/include/g++ >
minusplus
ben c'est dans
Code :
<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 :
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 :
int_type peek();
The unformatted input function
extracts an element, if possible, as if by returning
rdbuf()->sgetc().
Otherwise, it returns
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 ?