Donc on est d'accord, à l'occasion si tu trouve la réponse dans la norme dis le nous.
Cordialement.
Version imprimable
Je ne suis pas sûr que ce soit tellement le cas en C++, car c'est justement le genre de problème qui m'avait dissuadé d'utiliser les flux standard C++ (je ne connaissais pas l'équivalent C++ de fflush() à l'époque).
D'un autre côté, c'était sous Visual 6, donc...
A ma connaissance:
<HS>
</HS>Code:
1
2
3
4
5
6
7
8
9
10 #include <iostream> /* ... */ int nombre; std::cout << "Entrez un nombre entre 1 et 10: " /* << std::flush n'est pas necessaire ici */ while (!(std::cin >> nombre) || nombre < 1 || nombre > 10) { /* Mon code en cas d'erreur */ }
Dans ce code, l'invite est garantie de s'afficher à cause de la lecture sur le flux std::cin (il faut que je retrouve la référence). Pour un affichage équivalent en C, il faut appeler fflush(stdout):
ThierryCode:
1
2 printf("Entrez un nombre entre 1 et 10: "); fflush(stdout);
Comment interpreteriez-vous cet extrait de la norme?
ThierryCitation:
When a stream is line buffered, characters are intended to be transmitted to or from the host environment as a block when a new-line character is encountered. Furthermore, characters are intended to be transmitted as a block to the host environment when a buffer is filled, when input is requested on an unbuffered stream, or when input is requested on a line buffered stream that requires the transmission of characters from the host environment. Support for these characteristics is implementation-defined, and may be affected via the setbuf and setvbuf functions.
En effet, c'est bizarre et difficile à comprendre.
Mais je trouve encore plus étrange qu'une lecture sur un stream provoque le flush d'un autre stream...
[Warning: C++ detected] Cette fonctionnalité est implantée dans basic_istream. L'objet std::cin (qui permet de lire sur le flux d'entrée associé à stdin) est lié à l'object std::cout (qui permet d'écrire sur le flux associé à stdout). Ainsi, une saisie à l'aide de cin force la purge du tampon du flux associé à std::cout et c'est garantit par la norme.
En ce qui concerne la situation en C, je n'ai pas l'ouvrage de Braquellaire. A ma connaissance, les événements qui permettent de purger le tampon de stdout sont:
- Le tampon est plein
- Présence d'un caractère de fin de ligne
- Appel de fflush(stdout)
L'extrait de la norme posté plus haut n'est pas clair pour moi.
Thierry