web-dev-qa-db-fra.com

Que signifie "rincer" le tampon?

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 efface cout; 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?

83
Mohamed Ahmed Nabil

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.

98
David Heffernan

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;
19
tc.

Effacez le tampon en affichant tout.

3
Alex Chamberlain