C++のget()関数とgetline()関数の使用詳細

4258 ワード

C++get()関数1文字get()関数を読み込むのはcin入力ストリームオブジェクトのメンバー関数で、パラメータなし、パラメータが1つ、パラメータが3つの形式があります.1)パラメータを持たないget関数の呼び出し形式は

  cin.get()

指定した入力ストリームから空白文字を含む文字を抽出するために使用され、関数の戻り値は読み込まれた文字です.入力ストリームのファイル終端に遭遇すると、関数値はファイル終端フラグEOF(End Of File)を返し、一般的にはEOFを-1で表し、0や正の値ではなく-1で表し、文字のASCIIコードと混同されないことを考慮しているが、C++システムによって使用されるEOF値が異なる可能性がある.
[例]get関数で文字を読み込む.

#include 
using namespace std;
int main( )
{
int c;
cout< 
 

次のように動作します.

enter a sentence:
I study C++ very hard.�L(      )
I study C++ very hard.       (      )
^Z�L(    )

C言語のgetchar関数とストリームメンバー関数cin.get()の機能は同じで、C++はCのこのような使い方を保留して、getchar(c)でキーボードから1つの文字を読み込んでcに与えることができます.
2)パラメータのget関数があり、その呼び出し形式は

 cin.get(ch)

入力ストリームから1文字を読み出し、文字変数chに付与する役割を果たす.読み取りに成功した場合、関数はtrue(真)を返し、失敗した場合(ファイルの終端に遭遇した場合)、関数はfalse(偽)を返します.上記の例は次のように書き換えることができます.

#include 
using namespace std;
int main( )
{
  char c;
  cout< 
 

3)3つのパラメータを持つget関数の呼び出し形式はcinである.get(文字配列、文字個数n、終端文字)またはcin.get(文字ポインタ、文字個数n、終端文字)は、入力ストリームからn−1文字を読み出し、指定された文字配列(または文字ポインタが指す配列)に割り当て、n−1文字を読み出す前に指定された終端文字に遭遇した場合、読み出しを早期に終了する役割を果たす.読み取りに成功した場合、関数はtrue(真)を返し、失敗した場合(ファイルの終端に遭遇した場合)、関数はfalse(偽)を返します.さらに例13.6を以下に書き換える.

#include 
using namespace std;
int main( )
{
  char ch[20];
  cout< 
 

次のように動作します.

enter a sentence:
I study C++ very hard.�L
I study

入力ストリームには22文字があるが、get関数で指定されたnが10であるため、n−1文字(すなわち9文字)を読み出し、文字配列chの上位9要素に付与する.n-10を指定すると、なぜ9文字しか読めないのですか?文字列が格納されているため、9文字の後に文字列終了フラグを追加し、実際に配列に格納されているのは10文字です.文字列終了フラグを入れないと、どうなるか考えてみてください.結果は「cout<
入力した場合

  abcde

すなわち、9文字目を読み終わらないと終了文字に遭遇し、読み取り操作が終了し、上位5文字が配列ch[0]からch[4]に格納され、ch[5]に'0'が格納される.
get関数で指定したnが20で22文字を入力すると、入力ストリームの最初の19文字が文字配列chの最初の19要素に割り当てられ、1つの'0'が追加されます.
get関数の3番目のパラメータは省略できますが、デフォルトは''です.次の2行は等価です.

  cin.get(ch,10,'\
'); cin.get(ch,10);

終了文字は、他の文字でも使用できます.のように

  cin.get(ch,10,'x');

文字'x'に遭遇したときに読み取りを停止します.
C++getline()関数が1行の文字getline関数を読み込む役割は、3つのパラメータを持つget関数と同様に、入力ストリームから1行の文字を読み取ることです.すなわちcin.getline(文字配列(または文字ポインタ)、文字個数n、終了フラグ文字)
[例]getline関数で1行の文字を読み込む.

#include 
using namespace std;
int main( )
{
  char ch[20];
  cout<>ch;
  cout< 
 

プログラムの実行状況は以下の通りです.

enter a sentence: I like C++./I study C++./I am happy.�L
The string read with cin is:I
The second part is: like C++.
The third part is:I study C++./I am h

運転結果をよく分析してください.「cin>」で入力ストリームからデータを抽出し、スペースに遭遇すると終了します.したがって、1文字'I'のみを読み出し、文字配列要素ch[0]に格納し、ch[1]に'0'を格納する.だから「cout<
いくつかの説明があり、読者に考えてもらいます:1)2番目のcin.getline関数もcinと書く.getline(ch,20,'/'),出力結果はどうなりますか?最後の行の出力は次のとおりです.

  The third part is: I study C++.

2)cin.getline(ch,20,'/')入力ストリームからデータを読み出すと、リターンキー(「」)に遭遇し、読み取りを終了しますか?結論として、このとき「」は終了フラグではなく「」が1文字として読み込まれる.
3)getline関数で入力ストリームから文字を読み取る場合、終了フラグ文字に遭遇した場合に終了し、ポインタがその終了フラグ文字に移動した後、次のgetline関数は、本プログラムの実行結果に示すように、その終了フラグの次の文字から読み込まれます.cinを使えばget関数は,入力ストリームから文字を読み出すと,終了フラグ文字に遭遇したときに読み取りを停止し,ポインタは後方に移動せず,元の位置にとどまる.次の読み込みは、終了フラグ文字から開始します.これはgetline関数とget関数の違いです.例プログラムの2つのcinをline関数呼び出しは、次の関数呼び出しに変更されます.

  cin.getline(ch, 20, '/');

実行結果は次のとおりです.

enter a sentence: I like C++./I study C++./I am happy.�L
The string read with cin is: I
The second part is: like C++.
The third part is:  (             )

2番目のcin.getline(ch,20,'/')はポインタの現在位置から文字を読み出し、出会った1文字目が終了フラグ文字の読み込み終了であり、ch[0]に「0」のみを格納するので「cout<
したがってget関数を使用する場合は特に注意してください.必要に応じて、この終了フラグ文字をスキップします(後述するignore関数など、詳細は、入力に関連するistreamクラスメンバー関数を参照してください).しかし、一般的にはgetline関数を使用するほうが便利です.
4)「cin<