2017-11-18 10 views
2

が過負荷>>オペレータ機能である:私の理解するためにif(!(is >> s))はどういう意味ですか?ここで

std::istream& operator>>(std::istream& is, std::vector<int>& v){ 
    string s; 
    if (! (is >> s)) 
    return is; 
    ... 
    return is; 
} 

キーボードや他のソースからの入力がsを入力するまで、端末またはコンソールをお待ちしておりますので、if(! (is >> s))は意味をなさない。したがって、if()の状態の値は最終的にfalseになります。誰が助けることができますか?

+0

"は'が '文字列を読むことができない 'と読み替える必要があります。 –

+0

コードが濃すぎます。それは2つの部分で書かれていなければなりません: 'is is s; if(!is)... '。 –

答えて

3

is >> sは、ストリームisから文字列sを読み取ろうとします。

istreams operator>>()は、isへの参照を返します。

istream S operator!()テストストリームが無効な状態にある場合。具体的には、ストリームのbadbitまたはfailbitが設定されている場合はtrueを返します。

ので、

if (! (is >> s)) 
    return is; 

は、ストリームから文字列を読み込みに失敗した場合、関数はすぐに戻りますことを意味

is >> s; 
if (is.fail()) return is; // is.fail() returns true if failbit or badbit are set 

と機能的に同等です。これはストリームの最後に到達するのとは別のことです。

+0

私はこの投稿を徹底的に薄くしていますが、他のものは私にも有益です、ありがとう! :) – Finley

2

istreamはコンソールである必要はありません。ストリングストリームにすることができます。また、「ユーザー入力待ち」はアプリケーションコードでは認識されません。入力ストリームが満たされている間はとにかく(ライブラリーの基礎となる、オペレーティングシステムによって...、)眠って

です:入力ストリームは、すべてのデータが含まれていない場合には、この条件はtrueになります。あなたが1行に多くのことをやっている

std::string s; // empty! 
std::stringstream ss(s); 

std::vector<std::string> strings; 
ss >> strings; // should be empty! 
-1

! (is >> s) 

あなたはInputStreamを取ると条件であれば

1

にSのtehの結果を評価し、対象物Sを割り当てるためにそれを使用しますif (!(is >> s))は、何を意味するのかを理解することを意味します。if (is >> s)を意味します。

isstd::istreamなので、>>std::istreamを返します。したがって、is >> sstd::istreamであり、ifの内部では論理値trueまたはfalseを生成する必要があります。 This Q&Aは、さまざまなバージョンのC++でどのように処理されるかを説明しています。基本的に、std::istreamは、操作が成功したときに真の状態に評価されます。

今、あなたはis >> sの意味を知っていることを、あなたは否定を追加することが意味することを反転することを把握することができます:!(is >> s)isからsの読み取りが失敗した場合にのみ、真のだろう。文字列の場合、読み込みに失敗すると、たとえばストリームの終わりに達したために、ストリームが無効な状態にあることを意味します。

関連する問題