C++ cin.get()とcin.getline()メソッドの詳細と区別

4985 ワード

一、cin.get(...)
この方法には4つの一般的な形式があります.
	int get();                                              //#1
	istream& get(char& c);                                  //#2
	istream& get(char* s, streamsize n);                    //#3
	istream& get(char* s, streamsize n, char delim);        //#4
まず第1の形式を説明する:int get();
このメソッドは、入力ストリームから文字を抽出してintタイプで返す方法で、通常は次のように使用されます.
char ch;
ch = cin.get();
このときchはcinである.get()入力ストリームから抽出された文字は、intタイプでistreamタイプではないため、パッチでは使用できません.以下に説明する形式でパッチに使用できます.
第2の形式:istream&get(char&c);
この方法も入力ストリームから1文字を抽出しますが、文字を返すのではなく、抽出した文字をパラメータの参照cに割り当てます.以下は使用方法です.
	char ch;
	cin.get(ch);           //          ch             ,          ch 
またこの形式のget()メソッドはつなぎ合わせることができますが、どういう意味ですか?次の使用方法を見てください.
	char ch1;
	char ch2;
	cin.get(ch1).get(ch2);      //       
この形式のgett()メソッドはistreamオブジェクト参照を返すのでcin.get(ch 1)の実行が完了すると、抽出された最初の文字がch 1の参照に付与され、istreamオブジェクト参照が返される.ここでは*thisである.ここでget()はistreamオブジェクト呼び出しの方法であるため、最初のget()の実行が完了すると*thisに戻り、次に2番目のget()を実行する.形式は:(*this)に似ている.get(ch 2)またはcin.get(ch 2)なので、入力ストリームから2文字から2文字変数をそれぞれ抽出する必要がある場合は、この接合方法を使用します.
また、istreamオブジェクトをbool値パラメータを受け入れる場所に配置すると、istreamオブジェクトはboolタイプに変換されます.次の方法を参照してください.
	char ch;
	while(cin.get(ch)){       //  1
		...
	}
	char ch;
	cin.get(ch);
	while(cin){               //  2
		...
		cin.get(ch);
	}
の2つの方法は、istreamクラスオブジェクト、例えばcinをbool値を受け入れる場所に配置し、cinのようなbool値タイプに自動的に変換する.get()エラーでストリーム状態が設定されると、istreamクラスオブジェクトはfalseになり、すべてがうまくいけば、istreamオブジェクトはtrueになってwhileブロックを実行し続けます.
次に、第3の形式get()の方法を紹介します:istream&get(char*s,streamsize n);
この方法は2つのパラメータを受け入れ、1つ目のパラメータは1つの文字ポインタを受け入れ、ストリームから抽出したい文字列の格納位置を指し、2つ目のパラメータはストリームから抽出する必要がある文字数を受信し、実際にはget()はストリームからn-1文字しか抽出されませんが、最後の文字はデフォルト'0'空の文字です.例:
	const int arrSize = 5;
	char Str[arrSize];
	cin.get(Str,arrSize);

上記の例では、arrSizeの大きさのStr文字配列を作成し、ここでは5でcinを呼び出す.get()メソッドは、格納位置をその配列(Str)に指向し、文字数をarrSize個に設定する方法であり、実際にget()はarrSize-1文字のみを抽出し、abcdefを入力すると仮定し、ここでget()はストリームからarrSize-1文字、すなわち上位4文字のみを抽出し、Strの各要素は{'a','b','c','d','0'}つまりCスタイル文字列「abcd」である.4文字を超える文字を入力すると、get()が抽出した複数の文字が入力ストリームに残り、リターン記号を押したときに入力した「改行符」が含まれます.次にcinを呼び出して入力すると、ユーザーが自分で入力するまで待たずに、残りの文字が自動的に抽出されます.
文字を入力しすぎると残りの文字を空にするには、(もちろん、エラー入力がなくてステータスビットが設定されている場合に有効です.ステータスビットが設定されている場合は、入力をオフにすると無効になります.文字を読み取ることができないため、直接EOFに戻り、cin.clear()メソッドでステータスビットを消去して文字を読み取り続けることができます).
	while(cin.get() != '
'){ continue; }
さらに、このリロードバージョンのget()メソッドは、「無値入力」、すなわちcinを実行するときに受信.get(Str,arrSize);この行コードの場合、ユーザーは他の文字を入力せずに直接リターン(改行文字このリロードバージョンのデフォルト境界記号)を押して、指定した境界記号を受け入れるget()リロードバージョンについては、以下で説明します.入力ストリームから有効文字がStrに抽出されないため、Str[0]を自動的に'0'空白文字に設定し、ios_を設定します.base::failエラーフラグビットは、入力が閉じるので、後で再入力するにはcinを使用する必要があります.clear()または他の等価メソッドは、エラーフラグビットを消去して入力の読み取りを続行します.
第4の形式のget()方法:istream&get(char*s,streamsize n,char delim);
このリロードバージョンget()メソッドは、3つのパラメータを受け入れ、1つ目のパラメータはストリームから抽出された文字列が格納されている場所を指し、2つ目のパラメータはストリームから抽出する必要がある文字の数を受信し、この2つのパラメータは前のバージョンのget()と同じであり、3つ目のパラメータは1つの文字を受け入れ、指定された境界記号として使用します.前バージョンのget()メソッドistream&get(char*s,streamsize n);実際には「改行」を区切り文字としてデフォルトで使用していますが、区切り文字は何に使いますか?例えば、第3の形式のget()メソッドは、入力ストリームから2番目のパラメータで指定された数n−1を読み出したり、境界記号に遭遇したりするまで(ここでは改行記号を境界記号として)、次のコードを例に挙げます.
	const int arrSize = 5;
	char Str[arrSize];
	cin.get(Str,arrSize);
abを入力して戻るとarrSize-1つまり4文字を抽出していたので、しかし、2番目の文字を読み出した後に3番目の文字を読み取ると改行文字(折り返しは改行文字の入力に相当)に遭遇して読み取りを停止し、ストリームから抽出したab 2文字がStr配列に割り当てられ、末尾に'0'空の文字が追加されます.このとき、ストリームには改行文字が残っています.このリロードバージョンのget()は、境界記号を読み込まず、ストリームの境界記号も削除されません.要するに、次の2つの形式のget()バージョンは、ストリームから指定された数の文字が読み込まれた場合、または改行文字が事前に遭遇した場合、読み取りの継続を停止します.第4の形式のget()リロードバージョンは第3の形式と類似しており、第3のパラメータに境界子を指定できるだけで、動作はそれほど悪くない.
二、cin.getline(...)
このメソッドには、次の2つのバージョンがあります.
	istream& getline (char* s, streamsize n );                     //#1
	istream& getline (char* s, streamsize n, char delim );         //#2
の2つのリロードバージョンは、上記cin.get()の第3バージョンと第4バージョンの使用方法は同じです.
	istream& getline (char* s, streamsize n )   istream& get(char* s, streamsize n)  
	istream& getline (char* s, streamsize n, char delim )   istream& get(char* s, streamsize n, char delim)  
ですので、ここではgetline()の使い方を説明しません.ここでは、彼らの違いを簡単にまとめます.
get()に対応するgetline()バージョンの違いはget()が「空値入力」を受信しないことです.空値入力であればストリームエラーステータスビットを設定し、入力を閉じます.また、ストリームに境界記号(ここでは改行記号)が残っており、次回正常に入力できる場合は、まずその改行記号を文字として読み出し、いくつかの方法で改行記号を自動的に破棄しない限り、getline()は「空の入力」を受け入れます.getline()は境界記号を読み出して破棄します.境界記号も値であるため、エラーステータスビットの設定は起こりません.また、ストリームには、読み出して破棄されたため、残りの区切り文字(ここでは改行文字)は存在しない.また、getline()バージョンでは、入力が多すぎる文字に遭遇した場合(getline()がn-1文字を読み出した後、ストリームに残っている最初の文字が区切り文字であるかどうかを検出する.そうでなければ、読み出して破棄しないと、エラーフラグビットを設定して入力を閉じる).
以上が私のcinです.get()とcin.getline()の各リロードバージョンの理解、誤りがあれば、指摘してください.ここで感謝します.