5

istream 抽出がこのように失敗したかどうかをどのように検出できますか?

string s("x");
stringstream ss(s);
int i;
ss >> std::ios::hex >> i;

編集-質問のタイトルはこれをカバーしていますが、本文で言及するのを忘れていました:適切な情報を提供するために、失敗が不適切なフォーマット、つまり解析によるものなのか、それとも他のIO関連の問題によるものなのかを本当に検出したいフィードバック (malformed_exception("x") など)。

4

4 に答える 4

9
if(! (ss >> std::ios::hex >> i) ) 
{
  std::cerr << "stream extraction failed!" << std::endl;
}

それはとても簡単です。

ETA: これは、このテストがストリームの終わりとどのように相互作用するかの例です。

int i;
std::stringstream sstr("1 2 3 4");
while(sstr >> i)
{
    std::cout << i << std::endl;
    if(sstr.eof())
    {
        std::cout << "eof" << std::endl;
    }
}


1
2
3
4
eofを出力します

sstr.eof()while ループ条件でorをチェックするsstr.good()と、4 は出力されません。

于 2011-12-13T12:09:01.730 に答える
4

値の抽出に失敗すると、ストリームの「失敗」ビットが設定されます。これは、、if (ss.fail())またはだけで検出できますif (!ss)。同様に、操作の結果をテストでき>>ます。これは、ストリームへの参照を返すためです。

これらは、「不良」ビットを設定する他のエラーも検出します。これらは。で区別できますss.bad()

ストリームからの読み取りを続行する場合は、状態フラグ()をクリアする必要がありますss.clear()

于 2011-12-13T12:12:22.413 に答える
0

まず、有益な回答をありがとう。ただし、いくつかの調査 (cfr. cppreferenceを参照) と検証の後、解析の失敗のみを確認する 1 つの方法は、次のようにios::failbitフラグを確認することです。

const bool parsing_failed = (ss >> ios::hex >> i).rdstate() & ios::failbit ;

提案されたものistream::operator!istream::operator bool混ざり合ったもの( cplusplusreferenceのあちこちfailbit 参照)。badbit

于 2011-12-13T22:13:37.683 に答える
0

抽出中のエラーは、内部状態フラグによって通知されます。good()メンバー関数で確認できます。ここも参照してください: http://www.cplusplus.com/reference/iostream/stringstream

または、if()上記で提案したように -construction を使用するだけです。これは、ストリーム クラスの bool キャスト演算子により機能します。

于 2011-12-13T12:13:16.283 に答える