何かのようなもの
cin >> Delay1;
if(cin) { ... }
cin
先頭の空白をスキップするため、指定どおりには機能しません。ユーザーは単に Enter キーを押すことはできません。彼は最初にテキストを入力する必要があります。彼が次のように入力した場合
3a
次に、入力が まで double に読み込まれa
、そこで停止します。cin
何も問題が見つからずa
、ストリームに残ります。多くの場合、これで十分なエラー処理だと思います。しかし、ユーザーが上記のような内容を入力したときに実際に繰り返す必要がある場合は、もう少しコードが必要です。
改行までの入力全体が数値かどうかをテストする場合は、 を使用getline
し、文字列に読み取ってから数値に変換してみてください。
string delay;
if(!getline(std::cin, delay) || !isnumber(delay)) {
...
}
関数はisnumber
文字列ストリームを使用して文字列をテストできます
bool isnumber(string const &str) {
std::istringstream ss(str);
double d;
// allow leading and trailing whitespace, but no garbage
return (ss >> d) && (ss >> std::ws).eof();
}
はoperator>>
先頭の空白std::ws
を消費し、末尾の空白を消費します。ストリームの最後までヒットすると、シグナルが送信されeof
ます。このようにして、次に から読み取ろうとしたときにエラーが発生するのではなく、すぐにユーザーにエラーを知らせることができますcin
。
double を返す、または double のアドレスを `isnumber に渡す同様の関数を作成して、解析が成功した場合に結果を書き込むことができるようにします。
operator void*
また、さまざまなエラー フラグと、それらが、operator!
、good()
、fail()
とどのように関連しているかを確認することも価値がありbad()
ますeof()
。
flag | badbit | failbit | eofbit
function | | |
-----------------+---------+-----------+--------
op void* | x | x |
-----------------+---------+-----------+--------
op ! | x | x |
-----------------+---------+-----------+--------
good() | x | x | x
-----------------+---------+-----------+--------
fail() | x | x |
-----------------+---------+-----------+--------
bad() | x | |
-----------------+---------+-----------+--------
eof() | | | x
-----------------+---------+-----------+--------
x
それぞれのビットが結果に影響する場合があります。( )operator void*
に変換するときに使用され、コード実行に使用されます。bool
if(cin) ...
operator!
!cin