2013-03-04 51 views
1

爲什麼ss >> aa >> bb >> cc >> dd可用於狀態檢查?如果我使用ss >> aa >> bb >> cc >> dd >> ee這個操作的返回值是什麼?在條件下使用提取算子的返回值?

ifstream inputFile("source.txt", ifstream::in); 
string aa, bb, cc, dd; 
char line[1024]; 

while(!inputFile.eof()) 
{ 
    inputFile.getline(line, 1023); 
    stringstream ss(stringstream::in | stringstream::out); 
    ss.str(line); 

    if(ss >> aa >> bb >> cc >> dd) 
    { 
     cout << aa << "-" << bb << "-" << cc << "-" << dd << endl; 
    } 
} 

隨着的Source.txt這樣的:

1aaa ddd eee asd 
2dfs dfsf sdfs fd  
3sdf sdfsdfsdf d s 
+1

請注意,您在使用inputFile.getline'的'結果沒有檢查它是否成功與否。 – 2013-03-04 13:53:28

回答

5

流輸入操作的返回值是流。

表達

ss >> aa 

等於

operator>>(ss, aa) 

operator>>()函數返回的第一個參數。

使用多個輸入操作只需鏈接函數調用。例如

ss >> aa >> bb; 

變得

operator>>(ss, aa).operator>>(ss, bb); 

原因一個流可以用作一個布爾表達式,是因爲它有一個特殊的conversion operator,允許它被用作這樣。


順便說一句,你不應該使用while (!stream.eof())。相反,使用的事實,getline返回流,以及流可以在布爾表達式中使用:

while (inputFile.getline(line, 1023)) 
{ 
    // ... 
} 
+0

然後它被轉換爲一個'void *',我相信「它是真的還是不是」,並且該值是基於狀態標誌(與'!good'相同或者與其相近的東西) – 2013-03-04 13:35:09

+0

@MatsPetersson或者一個'bool'(如果使用C++ 11)。剛剛補充說。當fail()返回true時,它是「真」的。 – 2013-03-04 13:36:54

+0

@MatsPetersson _不同於'good()',而是'!fail()'。這很重要:'good()'在其評估中包含'eofflag',這使得它無用; 'fail()'返回'failbit || badbit';換句話說,它只考慮前面輸入的結果。 – 2013-03-04 13:51:40