2

次のコードで気付きました:

    cout << "Please enter your number: ";
    cin >> Number;
    cout << "Is this spaced";

C++ のコマンド ウィンドウの出力では、次の行に「Is this spaced」が自動的に表示されます。ストリームマニピュレータを使用する必要なく、行の後にスペースを空けますcin(なぜこれがストリームマニピュレータと呼ばれるのですか?) endl。一方、コードがある場合:

    cout << "Please enter your number: ";
    cout << "Is this spaced";

「これは間隔がありますか」で自動的に行を空けることはありません。代わりに、両方の行が結合されます。endl新しいスペースのラインを作成するには、あなたが必要だといつも思っていたので、なぜそうなのか知りたいです.

ありがとう!

4

3 に答える 3

6
cout << "Please enter your number: ";
cin >> Number;
cout << "Is this spaced";

これには、目に見える以上のものがあります。 std::coutおよびstd::cin- デフォルトでは -関連付けられたストリームです。つまり、入力が要求さstd::coutれるたびに自動的にフラッシュされます (つまり、プログラム内のバッファーからオペレーティング システムにフラッシュされる保留中の出力) 。そのため、プログラムが一時停止して入力を待つ前に、std::cin確実に確認できます。"Please enter your number: "もちろん、ほとんどのオペレーティング システムでは、プログラムが待機する前に入力を開始できます。入力を端末にエコーし、std::cin後で提供するために記憶します。これは、次のようなパイプラインを使用してプログラムを呼び出した場合にも発生します。

echo "123" | the_program

入力は実行開始時に利用可能ですが、解析を試みるthe_programためにそこにとどまります。cin >> Number;ただし、この場合、端末プログラムがエコーするキーボード入力がないため、「123\n」シーケンスは出力の 2 行間で画面にエコーされません。その改行「\n」がなければ、出力はすべて1行で表示されます。

キーボード入力でカーソルを次の行に移動させずにキーボードから読み取りたい場合は、ncurses または同様のライブラリを使用するのが最善です。ライブラリは、お使いの端末に適したエスケープ シーケンス (利用可能な場合) を使用して、カーソルの位置を好みに合わせて変更できます。サポートする端末の範囲が非常に限られている場合 (たとえば、xterm 互換の端末、VT220、または Windows コマンド シェルなど) は、自分でコーディングするのが実用的かもしれません。キーボード入力の出力を抑制することも一般的に可能ですが、ユーザーは自分が数字を入力しているのを見ることができませんでした。別のオプションは、端末を文字ごとの入力読み取りをサポートする入力モードに設定することです (一部の端末はデフォルトで行ごとに設定されるため、'

これとは別に、一部の呼び出し環境では最終行が表示されないため、プログラムの出力を改行で終了することをお勧めします。また、多少論争の的std::endlになりますが、出力をフラッシュする必要がない場合は使用しないことをお勧めします\n。C++ iostream ライブラリを使用して複数の行をバッファリングし、効率的なサイズのチャンクでオペレーティング システムに書き込みます。

フラッシングの説明

次のようなプログラムがあるとします。

std::string h = "hello ";
std::string w = "world";

std::cout << h;
std::cout << w << '\n';

ある段階で、プログラムはオペレーティング システム (Linux、Windows など) に印刷するテキストを伝える必要があり、それをシェル/コマンド プロンプトに送信できるようにします (画面に送信してバッファーに入れる場合があります)。スクロールバーなど)、ファイルなど。大まかに言うと、プログラムがオペレーティング システムにこの種のことを行うように指示するのは遅いため、"hello" を記憶し、"world" と\n(改行) を追加すると、プログラム全体がより速く動作します。次に、"hello world\n" をオペレーティング システムに一斉に送信します。プログラム内でのデータの格納と連結はバッファリングと呼ばれ、バッファからオペレーティング システムにデータを書き込む動作はフラッシュと呼ばれます。

于 2013-03-15T06:09:24.043 に答える
1

デフォルトでは、新しい行も追加する をcin受信すると、ストリームの読み取りが終了します。newline

于 2013-03-15T05:06:45.197 に答える
0

cin端末で( ) を使用する場合std::cin、端末に「入力が完了しました」と伝えるために、Enter キーを押さなければならないことがよくあります。

std::endlEnter も改行として変換されるため、 を押したために本質的に a に固執していますEnter

多くの場合、バックスペース文字\bを使用して、コンソールの現在の書き込みをバックトラックできます。試してみるとうまくいくかもしれませんstd::cout << '\b':私の端末(Windows)でたまたまバックトラックしました。

于 2013-03-15T05:08:57.317 に答える