web-dev-qa-db-ja.com

C ++でgetline()を使用する

Getlineメソッドを使用して、ユーザーが入力したメッセージを取得するのに問題があります。次のようなものを使用しています。

string messageVar;
cout << "Type your message: ";
getline(cin, messageVar);

ただし、出力値を取得するのは停止していませんが、これの何が問題になっていますか?

45
MGE

cin >> somethingの後にgetline()を使用している場合は、間にあるバッファーから改行文字をフラッシュする必要があります。 cin.ignore()を使用して実行できます。

次のようなものになります。

string messageVar;
cout << "Type your message: ";
cin.ignore(); 
getline(cin, messageVar);

これは、>>演算子が入力バッファに改行\n文字を残すために発生します。これは、改行文字が見つかるまで入力を読み取るgetline()などのフォーマットされていない入力を行うと問題になる場合があります。これは、前の操作でそこにぶら下がっていた\nのため、すぐに読み取りを停止します。

86
Natan Streppel

入力に改行が1つしかない場合は、

std::cin.ignore();

正常に動作します。入力から次の文字を読み取り、破棄します。

ただし、改行以外に入力にまだ何かがある場合(たとえば、1つのWordを読んで、ユーザーが2つの単語を入力した場合)、次のようにする必要があります。

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

例参照 このignore関数の参照

さらに安全にするには、 gcount がゼロを返すまで、ループで上記の2番目の選択肢を実行します。

同様の問題がありました。 1つの欠点は、cin.ignore()を使用すると、プログラムを台無しにするもう1回Enterキーを押す必要があることです。

2
logankilpatrick
int main(){
.... example with file
     //input is a file
    if(input.is_open()){
        cin.ignore(1,'\n'); //it ignores everything after new line
        cin.getline(buffer,255); // save it in buffer
        input<<buffer; //save it in input(it's a file)
        input.close();
    }
}
2
Antonija