2012-06-20 33 views
0

我對流行爲有疑問,請參閱以下示例。我期待的是,因爲字符串中只有5個字符,並且流讀取會卡住,因爲我正在讀取10個字符。相反,輸出是「hellooooo」......最後一個字符重複。 我的問題有兩個方面:第一,爲什麼?其次,是否有反應讓溪流像最後一個字符不再重複一樣?當從istringstream讀取時出現意外的行爲

#include <sstream> 
#include <iostream> 
using namespace std; 

int main(void) { 
    char c; 
    string msg("hello"); 
    istringstream iss(msg); 
    unsigned int i = 0; 
    while (i < 10) { 
     iss >> c; 
     cout << c; 
     i++; 
    } 
    cout << endl; 
    return 0; 
} 
+3

因爲你,當你到達流的末尾不停止讀取數據。在while()循環中檢查輸入的結尾 –

+0

@CaptainObvlious,乍一看我以爲你的名字是Captain Obvious,對於那個評論來說這是完美的。 –

+0

@MarkRansom,我仍然這樣做,現在我已經看到了這個名字,就像一百次。 – chris

回答

2

你看到的是在惡意狀態下讀取流的結果。當你讀過流中最後一個元素(這是一個字符串流)時,流變爲錯誤的,任何其他嘗試從它讀取都將失敗(並且保持抽取變量不變)。

您必須檢查是否進一步閱讀之前提取操作成功:

if (iss >> c) { 
    // succeess 
} else { 
    // failed to extract, handle error 
} 

是你使用連接到控制檯流(的例子)您到>>通話也會阻擋如你預期。 stringstream的行爲是不同的(你不能指望含有更多的數據)

0

原因是,當你讀到流的末尾,所有嘗試讀取後,只是失敗,留下最後一個值讀取在你的c

如果你想讀最多 10個字符:

while (i < 10 && is >> c) { 
    cout << c; 
    i++; 
} 

這工作,因爲流可以轉換爲bool,這是true如果流處於「良好」狀態。

相關問題