https://stackoverflow.com/a/10379322/924727に答えて、何が起こるかを説明してください。なぜについては、少し哲学に入る必要があります。
C++ ストリーム モデルは、"人間の対話" とは考えられていません。実質的に無限の文字シーケンスを、指定された "変数" に変換されるスペースで区切られた "値" のリストに変換する汎用コンバータです。
「ダイアログの入出力インターリーブ」という概念はありません。入力を次のようにテキストファイルに書き込む場合myinput.txt
(正しい入力を使用しない)
ABC456 9 7.8 XYZ
Y
ABC456 5 6.7 XYZ
N
次のようにコマンドプロンプトからプログラムをronします
myprogram < myinput.txt
あなたのプログラムは実行されます...そして出力を見るために「一時停止」する必要はありません。
プログラムがユーザー入力を待機するために一時停止するのはcin >>
、 が原因cin
ではなく、 が失敗状態ではなく、バッファーが空であり、バッファーが再マップするソースがコンソールであるためです。戻る前に '\n' を待つのはコンソールであり、cin ではありません。
cin >> n
呼ばれたら…
operator>>
関数が呼び出され、それが...
- ストリーム ロケールから num_get ファセットを取得し、その get 関数を呼び出します...
- ストリーム バッファ
sbumpc
を繰り返し呼び出して数字を取得し、数値を計算します。
- バッファにコンテンツがある場合は、その文字を次々に返します。これ以上文字が存在しない場合 (または空の場合) ...
- バッファーは、オペレーティング システムに低レベル ファイルから読み取るように要求します。
- ファイルがコンソールの場合、コンソールの内部ライン エディターが呼び出されます。
- これにより、Enter キーが押されるまで、ユーザーが文字といくつかのコントロール (たとえば、バックスペースなど) を押すことができなくなります。
- コンソール ライン エディタは、内容を入力 CON ファイルで使用できるようにする行をオペレーティング システムに返します。
- これは、(読み取り文字を cvt ロケール ファセットに渡した後ですが、これは詳細です) バッファーによって読み取られ、それ自体がいっぱいになります。
- ここで、展開を返します。
このすべてのメカニズムにより、必要以上に入力した場合、>>
別のプログラム行であるかどうかに関係なく、バッファーの内容は次の呼び出しで引き続き使用できるようになります。
適切な「より安全な」解析では、入力が読み取られた後、ストリームの状態がクリアされ、次のコンテンツまで無視される必要があります'\n'
。これは通常、
cin.clear();
cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
そのため、入力されたものはすべて破棄され、次cin>>
はデータのないバッファー (「開始スペース」としてトリミングされた , のみ) が見つかり'\n'
、コンソールが再び行編集モードになります。