istream & flush [C++] - Programmation
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 ?
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...
Marsh Posté le 22-05-2001 à 10:53:42
Accepte par le compilo, mais ca ne change rien au probleme...
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 ?
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...
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 :
|
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
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...
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 ...
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.
Marsh Posté le 22-05-2001 à 17:58:50
Merci a tous pour votre soutien
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]
Marsh Posté le 22-05-2001 à 18:10:38
Je préfère ma solution :
Code :
|
[edit]--Message édité par minusplus--[/edit]
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 !
Marsh Posté le 23-05-2001 à 11:12:56
Ben non desole.
eric@vsl155usr/include/g++ > more * | grep "traits_type"
eric@vsl155usr/include/g++ >
Marsh Posté le 23-05-2001 à 11:26:42
Code :
|
Marsh Posté le 23-05-2001 à 12:07:43
minusplus>
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
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...)
Marsh Posté le 23-05-2001 à 13:30:13
Marche po... mon programme tourne indefiniment sur la boucle while
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 : |
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.
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 !
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 :
|
tout simplement !
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.