1

私のコードはテスト用です。型変換が不可能な場合に stringstream が例外をスローするかどうかを確認しようとしています。

以下は私のコードです。お使いの環境で確認できます。

#include <string>
#include <iostream>
#include <sstream>

using namespace std;

int main() {
    stringstream stream("432.23");
    char c = 0;
    try {
      if(!stream>>c) {
        cout<<"Error happend"<<endl;
        return 0;
      }
    }
    catch(...) {
      cout<<"Exception happend"<<endl;
    }

    cout<<"c="<<c<<endl;
    return 0;
}

出力は c=^@ です

エラーを見つけるべきではありませんか?

4

3 に答える 3

3

オペレーター!は operator>> よりも優先度が高いため、コードを に変更する必要がありますif(!(stream>>c))。その後、c = 4 を取得します。

于 2012-07-21T13:41:24.383 に答える
2

問題は演算子の優先順位に関係しています

この線

if(!stream>>c) {

に等しい

if(0 >> c) 

期待される動作を得るには、括弧を使用する必要があります。

if(!(stream>>c)) { 

次に、最初にシフトを試みてから、ストリームの状態を確認します。

于 2012-07-21T13:44:41.137 に答える
1

コードには2つの問題があります。

if (!stream>>ccに読み込んだ後、ストリームのフェイルビットをテストしません。フェイルビットc(0)ステップを右シフトします。>>よりも優先されるため、に変更する必要がありますif (!(stream>>c))

また、char '4'をcに読み込むと正常に機能するため、ifステートメントを変更してもエラーにはなりません。

ストリームに例外をスローさせたい場合にできることは、ストリームに例外を設定することです(ただし、文字「4」をcに読み込んでもエラーは発生しません)。

stream.exceptions(ios_base::failbit | ios_base::badbit);
于 2012-07-21T13:49:23.230 に答える