4

次のコードスニペットは、stringstreamオブジェクトを使用して文字列から整数を抽出し、整数抽出が成功したかどうかを検出することを目的としています。stringstreamクラスは、>>演算子を継承して、istreamインスタンスへの参照を返します。整数抽出に失敗すると、strメンバーがまだstrInputであるのに、myStreamが0に等しくなるのはどうしてですか?

stringstream myStream(strInput);
if (myStream >> num){//successfull integer extraction}
else{//unsuccessfull integer extraction
cout<<myStream<<endl;
cout<<myStream.str().c_str()<<endl;}
4

2 に答える 2

5

operator bool()またはoperator void*()forがありstream、これは(のようなものを)返します!fail()-またはvoid *失敗したときにNULLの場合。したがって、ストリームが失敗していなければ、問題ありません。はオブジェクトへのoperator >>参照を返すstreamので、コンパイラは「うーん、ストリームオブジェクトを真理と比較することはできません。作成できるかどうかbool、または作成できるかどうかを確認void *しましょう。そうです。それを使用しましょう。

于 2013-02-10T23:56:13.357 に答える
1

答えは、に変換std::iosする演算子にあります( void*C ++ 11でに変換する演算子にbasic_iosbool置き換えられました):

iosから派生したストリームオブジェクトをポインタにキャストできます。エラーフラグ(failbitまたはbadbit)のいずれかが設定されている場合、このポインターはnullポインターです。それ以外の場合は、ゼロ以外のポインターです。

この演算子は、ストリームが、、、または条件ifで使用されるときに呼び出されます。あなたが書く必要がある場合のための単項演算子もありますwhilefor!

if (!(myStream >> num)) {
    ...
}
于 2013-02-10T23:56:27.433 に答える