標準入力に対するエラー処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
vow256
記事: 13
登録日時: 6年前
連絡を取る:

標準入力に対するエラー処理について

#1

投稿記事 by vow256 » 6年前

C++ の int は -2147483648 〜 2147483647 の範囲を扱えますが、標準入力の際にその範囲外にある値や文字列などが入力された時のエラー処理の仕方が分かりません。

一度 string で読み込んでからその文字列の大きさや中に含まれる文字の種類について処理を行い、また整数に戻すという方法を考えてはみたのですがどうもしっくりきません。

もう少し無駄を省いたような方法がありましたら、教えていただきたいです。

Bull
記事: 149
登録日時: 9年前

Re: 標準入力に対するエラー処理について

#2

投稿記事 by Bull » 6年前

コード:

#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';
		}
	}
}
安直ですが、こういう感じでチェックできます。

アバター
vow256
記事: 13
登録日時: 6年前
連絡を取る:

Re: 標準入力に対するエラー処理について

#3

投稿記事 by vow256 » 6年前

回答ありがとうございます。

仕組みはなんとなく理解できたのですが、
cin.bad() と cin.ignore(INT_MAX, '\n') がどのようなものなのか
教えていただけないでしょうか。

Bull
記事: 149
登録日時: 9年前

Re: 標準入力に対するエラー処理について

#4

投稿記事 by Bull » 6年前

bad() は ios_base::badbit が設定されていると true を返します。
fail() との違いを確認するために入れたのであって、このプログラムでは
特に必要なかったかもしれないですね。

badbit はストリームに不整合があって場合に、セットされるのですが、
コンソール(キーボード)やディスクファイルから読込んでいる限り、
あまりエラーになることはないかもしれません。

ignore() は入力ストリームを読み捨てます。例えば数字以外("abcd"など)を
入力した場合 fail() が true になりますが、入力された文字列はそのまま
ストリームに残ったままです。間違った入力を読み捨てないと、次に読込ん
だ時に、またエラーになってしまいます。ここでは一行(改行まで)読み捨て
ています。

あと、MAX_INT ではなく numeric_limits<streamsize>::max() の方がいいですね。

アバター
vow256
記事: 13
登録日時: 6年前
連絡を取る:

Re: 標準入力に対するエラー処理について

#5

投稿記事 by vow256 » 6年前

詳しく説明していただきありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る