2012-04-26 7 views
2

ユーザーからの入力があったときにバッファが必要なのはなぜですか?例えばユーザからの入力があったときにバッファが必要なのはなぜですか?

chat arr[10]; 
cin>>arr; 
// or 
cin.get(arr,10); 

私は、ユーザーが入力した入力を格納するバッファと呼ばれる一時的な変数があることを読みました。したがって:

  1. 文字配列の場合だけコンパイラはバッファを使用しますか?答えが「いいえ」の場合、いつ使用されますか?

  2. 上記の例では、コンパイラがbufferを使用する理由は何ですか?

  3. 上記の例のバッファが配列の場合、コンパイラはどのようにサイズを選択しますか?

+1

C++を使用すると、おそらくべき 'STRING'型を持っています代わりに使用してください。バッファーを使用するコンパイラーではなく、プログラマーの* you *です。サイズの選択と同じ扱い - コードを書くときの責任はあなたの責任です。文字列型を使用すると、これらの問題などが解決されます。 –

+0

@CodyGray:std :: stringを使用すると簡単に行くことができます。私はちょうどコンパイラがどのようにこれを行うのか理解しようとしていますあなたは私の質問に対するアンサーを持っていれば、私はそれをpreciateします。ありがとう – AlexDan

+0

"私はバッファーと呼ばれる一時変数があることを読んで"非常に真ではありません。あなたがその名前で変数を作るならば、変数呼び出し側 'buffer'だけがあります!現在、システムはすべての入出力にバッファーを使用することがありますが、低コンソールアプリケーションはそれらの近くでは使用できません。 –

答えて

3

様々な理由のために関与するいくつかの中間バッファは、あります

  1. OSが内部バッファを持っています。これは入力に幾分依存します デバイス:ディスクからの物理読み取りはセクタによって行われるため、 のセクタサイズの倍数であるバッファを使用する必要があります。キーボードの入力は です。改行文字までは通常はバッファされますが、編集の程度(バックスペースなど)は です。等々。これはほとんどの場合 がアプリケーションに透過的ですが、 が1文字だけ読み取っても、ユーザー が改行を入力するまで読み取りは返されません。

  2. istreamで使用されるstreambufにはバッファがあります。これは、 に、OSへの要求数を減らすために行われます。このバッファのサイズは通常、streambufのタイプに依存します。 filebufは、通常、 プラットフォームファイルIO —に最適化され、効果的に の要求を減らすのに十分な大きさですが、ページングを誘導するほど大きくはありません。一部のシステムでは、ファイルの種類によっては がありますが、filebufは、 バッファをファイルのメモリマッピングに置き換える可能性があります。

streambufには、バッファ管理の変更を可能にする機能があります。 。しかし、それらを使用すべきであることは非常にまれです。図書館の著者 は、一般的には、あなたが簡単に改善することができないほど十分な仕事をしています。

>>演算子に関して:このバッファリングはすべて、下位の レベルで発生します。 >>演算子(実際にはistreamからのすべての入力) は、個々の文字または文字配列の要求を streambufに転送します。 の文字の実際の入力をデカップリングすることは、istreamというデザインの基本です。istream は解析のみを行います。実際の入力を処理するstreambuf へのポインタを含んでいます。 (解析関数の一部 もバッファが含まれていてもよい。例えば、int>>は、実際の変換を開始する前に、バッファ内の数字の シーケンスを収集する場合があります。)

1

入力(外部から収集されたデータ)を格納する場所がある必要があります。これがなければ、がなぜの入力がまったく行われるのか分かりません。

スカラー型としても知られる)であっても、他のデータ・タイプの—最も明確intに保持された数字、long、及びfloat —結果を格納するのに十分なストレージを割り当てる宣言された変数が存在しなければならない:

long n; 
double d; 
cin >> n; 
cin >> d; 

コンパイラはサイズを選択しません。あなたはそれを宣言しなければなりません。一般的には大きすぎても問題ありませんが、小さすぎるといくつかの問題が発生する可能性があります。

+0

ここで、はあなたの例のバッファです。あなたの例ではバッファーが必要だとは思わない。私は、入力がchar配列(私の例では)であるときにバッファを使うと思ったのは、delimeterの後に来る抽出文字です。私が間違っている場合は私を修正します – AlexDan

+0

@AlexDan:システムのパフォーマンスと効率を向上させるために存在するいくつかのバッファ層が背後にあります。それらのうちのいくつかは明示的にオフにすることができます(あなたが何をしているのか分かっている場合)が、デフォルトの処理は通常あなたが望むものです。バッファリングは、C++ランタイムライブラリ、オペレーティングシステム、およびデバイスドライバによって実行されます。 – wallyk

+0

などがあります。バッファにすでに抽出されていない区切り文字 '\ n'があるので、getline funtctionは無視されます。バッファが正確にどこに属するか。それはistreamのグローバルまたは静的メンバーです。ありがとう – AlexDan

関連する問題