1

だから私はそのコードの一部を理解しています:

cin.ignore(80, '\n');

リターン(Enterキー)を押して停止するまで、最大80文字のバッファーをクリアします...そうですか?

ここに質問があります...

1)cin.ignore();パラメータなしで単純に行うことの違いは何ですか?どのような状況でどちらがより適切に使用されますか?

2)cin.clear();エラーフラグをクリアすると言います...これはどういう意味ですか?エラーフラグとは何ですか?なぜそれらをクリアしたいのですか?

ありがとう!

4

2 に答える 2

4

エラー フラグは、ストリーム オブジェクトに対する何らかの操作が失敗するたびに設定されます。ストリームがエラーになると、エラー状態をリセットするまで、それ以上の操作は成功しません。

簡単な例を次に示します。

std::istringstream iss("ABC123");

int n;
iss >> n;

assert(!iss);

現在、ストリームはエラーになっています。ただし、まだデータが残っているため、リセットして再試行する価値がある場合があります。

iss.clear();  // note: this must come first!

std::string token;
iss >> token;

assert(iss);

別の抽出の代わりに、再試行する前に無視する必要があることがわかっている場合は、iss.ignore()の後に呼び出すこともできます。clear()

通常、この種の試行錯誤はあまり良い方法ではありません。完全な行を取得するために、常にgetline最初にストリームで使用します。これは、ストリームが使い果たされた場合 (ファイルの終わり、または文字列の終わり) にのみ失敗する可能性があります。次に、専用の解析ロジックによって各行の処理に進むことができ、エラーは最も適切な方法で処理できます。元のストリームのエラー フラグは粗すぎて、洗練された制御フロー設計を行うことができません。

于 2012-10-20T23:51:01.357 に答える
1

私はあなたの2番目の質問に答えることができます。cin.clear()関数は、2つの異なる段落を入力しようとするときに役立ちます。例えば ​​:

std::vector<std::string> veca,vecb;
std::string x;
while(getline(std::cin,x))
     veca.push_back(x);
cin.clear();
while(getline(std::cin,x))
     vecb.push_back(x);

cin.clear()関数を使用しなかった場合vecb、cinは以前にファイルの終わりに遭遇したため、何も得られませんでした。これがお役に立てば幸いです。

于 2013-03-16T06:39:10.990 に答える