0

以前に奇妙な問題に遭遇しました。私はBツリーへの挿入に取り組んでおり、簡単な表示関数を作成しました。実行しましたが、いくつかの値を挿入してもコンソールに何も表示されませんでした。

デバッグモードに入り、プログラムのフローに従い、デバッガーはツリーに値が含まれていることを示しました。次に、最初のノードの要素のみを表示したかったのですが、同じ問題が発生しました。コンソールが空です。

endl私は私の先生に何が間違いであるか尋ねました、そして彼は私に次のように後を置くように言いましたcout

cout << node->keys[i] << endl;

機能した!彼はその時私に、おそらく私が私のプログラムでポインターに対処し、Eclipseはそれについて何も言わないが、どのように役立つNULLかについては何も言わないと言った。endl

何が問題になる可能性があり、それがどのようにそれをendl解決するかを誰かが知っていますか?私は非常に混乱しています。バッファのフラッシュが表示機能と何の関係があるのか​​理解できませんでした。

4

5 に答える 5

1

私は答えるのが少し遅れており、フラッシュする方法はすでに他の答えによって説明されているので、少なくともジョンジーの答えに対するあなたのコメントに答えたいと思います。

まず、出力がバッファリングされる理由は、メモリではなく出力ストリームにデータを書き込むのは通常、非常に遅い操作であるためです(これは、ssdまたはhddのファイルに書き込むか、ディスプレイだけに書き込むかによって異なりますが、すべてがラムよりもはるかに遅いです)。

したがって、c ++は最初にそれを内部バッファーに書き込み、実際にはバッファーがいっぱいになったとき、またはストリームをフラッシュしたときにのみ出力に書き込みます。これは、ほとんどの出力ストリームへの書き込みの遅い操作を回避するために行われます。

では、なぜ表示される前にバッファをフラッシュする必要があるのでしょうか...すでに述べたように、バッファがいっぱいになるか、明示的にフラッシュされるかを確認するために、実際にバッファを書き出すだけです。これで、プログラムが正常に終了すると、すべてのストリームが自動的にフラッシュされるため、プログラムのクラッシュが発生し(クラッシュしてもバッファがフラッシュされません)、プログラムは表示されずに終了します。

追加するとプログラムはすべてを正しく表示するので、最後にaが付いたノードを出力しようとしていて、から戻る直前にクラッシュしてendlいると思います。メインの直前に追加し、表示されるかどうかをテストすることで、簡単にテストできます。nullptrmainstd::cout << "end of the program" << std::endl;return

于 2013-03-12T14:40:57.547 に答える
1

std::endl出力ストリームをフラッシュします...。

coutがバッファリングされると、出力はすぐには表示されません。バッファがオーバーフローするまでバッファリングされ、その後、バッファリングされたすべてのデータが表示されます。出力をもっと早く表示したい場合は、flushそれ。

エンドライン文字を出力シーケンスosに挿入し、os.put(os.widen('\ n'))に続いてos.flush()を呼び出すかのようにフラッシュします。[1]

あなたも使用std::cout.flush();できます。

于 2013-03-12T11:40:27.423 に答える
0

std::endlエンドライン文字を出力シーケンス(このos場合は、cout)に挿入し、その後に。flushを呼び出して、まるでそれをesします。os.put(os.widen('\n'))os.flush()

std::cout標準のC出力ストリームstdoutに関連付けられた、実装定義タイプ(std :: streambufから派生)のストリームバッファーへの出力を制御します。この出力はバッファリングされます(とは異なりstd::cerrます)

ソースコードを挿入する前はendl、バッファがフラッシュされておらず、出力が画面に表示されていませんでした。

于 2013-03-12T11:40:35.097 に答える
0

std::endl出力ストリームに改行文字を追加するだけでなく、フラッシュさせます。バッファの大きさはよくわかりませんstd::coutが、バッファがいっぱいではなく、フラッシュされないため、何も表示されない可能性があります。cout.flush();データを追加した後(追加せずに)呼び出しstd::endlて、問題が解決するかどうかを確認できます。

于 2013-03-12T11:41:07.420 に答える
0

MMが上記の他の人と同じように彼の答えで述べたように、出力std::endlストリームをフラッシュします。これは、結果/出力をすぐに/リアルタイムで標準出力ソースに表示または配置することを意味します。

'\n'の代わりにを使用するstd::endlと、同様の出力が得られますが、操作がまだ行われている場合はすぐに表示されない場合があります。

std :: endlの一般的な欠点は、パフォーマンスの低下と見なされますが、出力がファイルではなくディスプレイにストリーミングされる場合は重要ではない可能性があります。ここで、'\n'が推奨される方法です。

お役に立てれば。

于 2013-03-12T13:43:21.567 に答える