バッファをフラッシュするとはどういう意味ですか?


95

私はC ++を学習していますが、理解できないことが見つかりました。

出力バッファを明示的にフラッシュして、バッファを強制的に書き込むことができます。デフォルトでは、cinフラッシュの読み取りcoutcoutプログラムが正常に終了した場合にもフラッシュされます。

バッファをフラッシュします(たとえば、出力バッファ):これは、すべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?または、バッファのフラッシュは、まったく異なることを意味しますか?

回答:


122

ファイルへの書き込みを検討してください。これは高価な操作です。コードで一度に1バイトを書き込む場合、1バイトの書き込みごとに非常にコストがかかります。したがって、パフォーマンスを向上させる一般的な方法は、書き込み中のデータを一時バッファーに格納することです。大量のデータがある場合にのみ、バッファがファイルに書き込まれます。書き込みを延期し、大きなブロックを一度に書き込むことで、パフォーマンスが向上します。

これを念頭に置いて、バッファをフラッシュするとは、バッファからファイルにデータを転送することです。

これは、すべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?

後者。


1
ありがとう。もう一つ。cinを読み取ると、coutがフラッシュされます。これは、ユーザーが何かを入力したとき、またはユーザーが何かを入力するように求められたときの意味ですか。
Mohamed Ahmed Nabil 2013

4
cinの読み取りは、ストリーム演算子を使用してcinから読み取るときに発生します。通常、読み取り時にcoutをフラッシュする必要があります。そうしないと、プロンプトの前に入力が表示される可能性があります。
David Heffernan 2013

1
@DavidHeffernan私が知る限り、cinとcoutは結びついているので、cinの前にcoutをフラッシュする必要はありません(Stroustrup、C ++プログラミング言語[io.tie])。
sturmer 2013年

24

あなたは答えを引用しました:

出力バッファーを明示的にフラッシュして、バッファーを強制的に書き込むことができます。

つまり、出力を「フラッシュ」して、基になるストリーム(ファイル、またはリストされている例では端末)に書き込む必要がある場合があります。

通常、stdout / coutはラインバッファリングされます。出力は、改行を書き込むか明示的にバッファをフラッシュするまでOSに送信されません。のようなものはstd::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl、基礎となる「ファイル」への書き込みが6回ではなく1回だけになるので、パフォーマンスが大幅に向上します。欠点は、次のようなコードです。

for (int i = 0; i < 5; i++) {
    std::cout << ".";
    sleep(1); // or something similar
}

std::cout << "\n";

.....すぐに出力されます(正確なsleep実装については、この質問を参照してください)。このような場合は<< std::flush、出力が確実に表示されるようにするために追加が必要になります。

cinフラッシュを読み取るcoutため、これを行うために明示的なフラッシュは必要ありません。

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;

(int i = 0; i <5; i ++){std :: cout << "。";に対してこれを行う スリープ(1); } std :: cout << std :: endl; 印刷されない.....すぐに。1ミリ秒の間隔でそれらを印刷します。sleep(1000)を使用すると、より多くのことに気付くでしょう
Mohamed Ahmed Nabil

@MohamedAhmedNabil sleep()(POSIX)とSleep()(Windows)
tc

1
古い答えですが、コメントだけが内容についてではなく、例についてです。cout名前空間(つまりstd::cout)を使用して修飾しましたが、では修飾を行わなかったため、endlその修飾も必要です。
vol7ron、2016

1
私はあなたの例が好きです。しかし、endlはバッファをフラッシュすると思いましたが、あなたの例では、\ nバッファをフラッシュします。私は混乱しています。
Naz

1
@Naz \ nはバッファをフラッシュしません。彼の例では、バッファーはプログラムの最後でのみフラッシュされます(バッファーは常にC ++プログラムの最後で自動的にフラッシュされます)。\ n書式設定に使用された可能性があります。また、あなたはstd :: endlがバッファをフラッシュするのは正しいです(そうすることでstd :: flushもフラッシュしますが、それは自明です)。
liamnickell 2017

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.