何も読み取れなかった場合は、を設定しfailbit
ます。if条件でストリームをテストし、ビットをクリアするだけです。
if(!getline(std::cin, myline)) {
std::cin.clear();
std::cout << "you should enter something" << std::endl;
}
内部的には、シーケンスは次のようになります。
- ターミナルで文字列を待ちます。ユーザーが改行を送信するまで、ターミナルはブロックされます。考えられる2つのエラーケース
- ユーザーはすぐにEOFを押します。これにより
getline
、何も読み取られなくなり、とが設定されfailbit
ますeofbit
。
- ユーザーが何かを入力してからEOFを押します。これにより、
getline
何かが消費され、次の文字を取得しようとしているときにEOFにヒットします。これeofbit
が設定されます。
- もう一度何かを読み込もうとします。
istream::sentry
抽出関数は、ストリームがどのような状態であるかをチェックするタイプのオブジェクトを作成します。エラービットのいずれかが設定されている場合、抽出関数はすぐに戻ります。それは前に無限のループを引き起こしました。
を呼び出すと、clear()
すべてのエラービットがクリアされ、もう一度読み続けることができます。