J'apprends le C++ et j'ai trouvé quelque chose que je ne comprends pas:
Les tampons de sortie peuvent être explicitement vidés pour forcer l'écriture du tampon. Par défaut, la lecture de
cin
effacecout
;cout
est également vidé lorsque le programme se termine normalement.
Donc vider le tampon (par exemple, un tampon de sortie): est-ce que cela efface le tampon en supprimant tout ce qu'il contient ou efface-t-il le tampon en affichant tout ce qu'il contient? Ou est-ce que vider le tampon signifie quelque chose de complètement différent?
Pensez à écrire dans un fichier. C'est une opération coûteuse. Si dans votre code, vous écrivez un octet à la fois, chaque écriture d'un octet sera très coûteuse. Ainsi, un moyen courant d’améliorer les performances consiste à stocker les données que vous écrivez dans un tampon temporaire. Le tampon est écrit dans le fichier uniquement lorsqu'il y a beaucoup de données. En reportant les écritures et en écrivant un gros bloc en une seule fois, les performances sont améliorées.
En gardant cela à l’esprit, vider la mémoire tampon revient à transférer les données de la mémoire tampon au fichier.
Est-ce que cela efface le tampon en supprimant tout ce qu'il contient ou efface-t-il le tampon en affichant tout ce qu'il contient?
Le dernier.
Vous avez cité la réponse:
Les tampons de sortie peuvent être explicitement vidés pour forcer l'écriture du tampon.
Autrement dit, vous devrez peut-être "vider" la sortie pour l'écrire dans le flux sous-jacent (qui peut être un fichier ou, dans les exemples cités, un terminal).
En règle générale, stdout/cout est tamponné sur la ligne: la sortie n'est envoyée au système d'exploitation que lorsque vous écrivez une nouvelle ligne ou videz explicitement le tampon. L'avantage est que quelque chose comme std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl
ne provoque qu'une écriture dans le "fichier" sous-jacent au lieu de six, ce qui est bien meilleur pour les performances. L'inconvénient est qu'un code comme:
for (int i = 0; i < 5; i++) {
std::cout << ".";
sleep(1); // or something similar
}
std::cout << "\n";
affichera .....
à la fois (pour la mise en oeuvre exacte de sleep
, voir cette question ). Dans ce cas, vous voudrez un << std::flush
pour vous assurer que le résultat est affiché.
Lire cin
efface cout
afin que vous n'ayez pas besoin d'un éclat explicite pour faire ceci:
std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;
Effacez le tampon en affichant tout.