3

を使用してファイルを解析しようとしていますが、std::istreamエラー処理を簡素化するために例外を使用したいと考えています。ただし、ストリームは、有効になっている場合でも、eofで例外をスローすることはありません。

次のスニペットについて考えてみます。

std::string line("Lorem ipsum");
std::istringstream is(line);
is.exceptions(std::ios::eofbit | std::ios::failbit);

std::string value1, value2, value3;
is >> value1;
std::cout << is.eof() << std::endl;
is >> value2;
std::cout << is.eof() << std::endl;
is >> value3;
std::cout << is.eof() << std::endl;

value2を読み取った後、trueeof()を返しますが、ストリームにそうするように指示されていても、いつでも例外はスローされません(3行目を参照)。最後に、value3には空の文字列が含まれています。

私は何が欠けていますか?

重要な場合:Xcode4.6.1の一部であるLLVMlibc ++(C++11をサポートするLLVMC++)を使用しています。

4

1 に答える 1

3

libc ++の実装と、この動作を指定する標準の部分の両方を確認しました。

27.7.2.1クラステンプレートbasic_istream[istream]/ p3:

またはがを返す場合rdbuf()->sbumpc()、特に明記されていない限り、入力関数はアクションを完了して実行します。これにより、(27.5.5.4)がスローされる可能性があり ます。rdbuf()->sgetc()traits::eof()setstate(eofbit)ios_base::failure

そしてp4:

これらの呼び出された関数の1つが例外をスローした場合、特に明記されていない限り、入力関数はbadbitエラー状態になります。badbitでがオンの場合exceptions()、入力関数はアクションを完了せずに例外を再スローします。それ以外の場合は、何もスローせず、呼び出された関数が失敗表示を返したかのように続行します。

ここで重要なのは、「これらの呼ばれる関数の1つ」の解釈だと思います。私はそのフレーズを、を含む前の段落で述べたすべての機能を指すと解釈しましたsetstate(eofbit)。その解釈では、が設定されていないため、libc++の動作は正しいbadbitです。

希望する動作を取得するには、次のようにします。

is.exceptions(std::ios::eofbit | std::ios::failbit | std::ios::badbit);
于 2013-03-27T18:58:07.783 に答える