C++ の int は -2147483648 〜 2147483647 の範囲を扱えますが、標準入力の際にその範囲外にある値や文字列などが入力された時のエラー処理の仕方が分かりません。
一度 string で読み込んでからその文字列の大きさや中に含まれる文字の種類について処理を行い、また整数に戻すという方法を考えてはみたのですがどうもしっくりきません。
もう少し無駄を省いたような方法がありましたら、教えていただきたいです。
標準入力に対するエラー処理について
Re: 標準入力に対するエラー処理について
#include <iostream>
int main(void)
{
using std::cin;
using std::cout;
using std::cerr;
int num;
for (;;) {
cout << "Input :";
cin >> num;
if (cin.fail()) {
if (cin.bad())
break;
if (cin.eof())
break;
cerr << "Input Error\n";
cin.clear();
cin.ignore(INT_MAX, '\n');
} else {
cout << "Number:" << num << '\n';
}
}
}
Re: 標準入力に対するエラー処理について
回答ありがとうございます。
仕組みはなんとなく理解できたのですが、
cin.bad() と cin.ignore(INT_MAX, '\n') がどのようなものなのか
教えていただけないでしょうか。
仕組みはなんとなく理解できたのですが、
cin.bad() と cin.ignore(INT_MAX, '\n') がどのようなものなのか
教えていただけないでしょうか。
Re: 標準入力に対するエラー処理について
bad() は ios_base::badbit が設定されていると true を返します。
fail() との違いを確認するために入れたのであって、このプログラムでは
特に必要なかったかもしれないですね。
badbit はストリームに不整合があって場合に、セットされるのですが、
コンソール(キーボード)やディスクファイルから読込んでいる限り、
あまりエラーになることはないかもしれません。
ignore() は入力ストリームを読み捨てます。例えば数字以外("abcd"など)を
入力した場合 fail() が true になりますが、入力された文字列はそのまま
ストリームに残ったままです。間違った入力を読み捨てないと、次に読込ん
だ時に、またエラーになってしまいます。ここでは一行(改行まで)読み捨て
ています。
あと、MAX_INT ではなく numeric_limits<streamsize>::max() の方がいいですね。
fail() との違いを確認するために入れたのであって、このプログラムでは
特に必要なかったかもしれないですね。
badbit はストリームに不整合があって場合に、セットされるのですが、
コンソール(キーボード)やディスクファイルから読込んでいる限り、
あまりエラーになることはないかもしれません。
ignore() は入力ストリームを読み捨てます。例えば数字以外("abcd"など)を
入力した場合 fail() が true になりますが、入力された文字列はそのまま
ストリームに残ったままです。間違った入力を読み捨てないと、次に読込ん
だ時に、またエラーになってしまいます。ここでは一行(改行まで)読み捨て
ています。
あと、MAX_INT ではなく numeric_limits<streamsize>::max() の方がいいですね。