私はC ++を学習していますが、理解できないことが見つかりました。
出力バッファを明示的にフラッシュして、バッファを強制的に書き込むことができます。デフォルトでは、
cinフラッシュの読み取りcout。coutプログラムが正常に終了した場合にもフラッシュされます。
バッファをフラッシュします(たとえば、出力バッファ):これは、すべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?または、バッファのフラッシュは、まったく異なることを意味しますか?
私はC ++を学習していますが、理解できないことが見つかりました。
出力バッファを明示的にフラッシュして、バッファを強制的に書き込むことができます。デフォルトでは、
cinフラッシュの読み取りcout。coutプログラムが正常に終了した場合にもフラッシュされます。
バッファをフラッシュします(たとえば、出力バッファ):これは、すべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?または、バッファのフラッシュは、まったく異なることを意味しますか?
回答:
ファイルへの書き込みを検討してください。これは高価な操作です。コードで一度に1バイトを書き込む場合、1バイトの書き込みごとに非常にコストがかかります。したがって、パフォーマンスを向上させる一般的な方法は、書き込み中のデータを一時バッファーに格納することです。大量のデータがある場合にのみ、バッファがファイルに書き込まれます。書き込みを延期し、大きなブロックを一度に書き込むことで、パフォーマンスが向上します。
これを念頭に置いて、バッファをフラッシュするとは、バッファからファイルにデータを転送することです。
これは、すべてを削除してバッファをクリアしますか、それともすべてを出力してバッファをクリアしますか?
後者。
あなたは答えを引用しました:
出力バッファーを明示的にフラッシュして、バッファーを強制的に書き込むことができます。
つまり、出力を「フラッシュ」して、基になるストリーム(ファイル、またはリストされている例では端末)に書き込む必要がある場合があります。
通常、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;
sleep()(POSIX)とSleep()(Windows)
cout名前空間(つまりstd::cout)を使用して修飾しましたが、では修飾を行わなかったため、endlその修飾も必要です。
すべてを出力してバッファをクリアします。