2009-10-09 81 views
2

我一直在嘗試使用C++ stringstream類來做一些相對簡單的字符串操作,但是我對get()方法有問題。由於某些原因,每當我提取輸出字符時,它會追加最後一個字母的第二個副本。C++ stringstream返回額外的字符?

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

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(!ss.eof()) { 
     ss.get(c); 
     cout << "char: " << c << endl; 
    } 
    return 0; 
} 

從程序的輸出是:

char: h 
char: e 
char: l 
char: l 
char: o 
char: o 

任何幫助,您可以給我在這,將不勝感激。

+0

是的,這是一個錯字。 #include 應該是#include Chris

回答

8

在流ss.eof()結束還不知道流的末尾將很快達成,但字符以下提取失敗。由於提取失敗,因爲流的末尾已達到,c未更改。您的程序無法識別ss.get(c)失敗並再次打印舊值c

一種更好的方式,以檢查是否存在仍然是可以從流中讀取會是這樣一個循環的字符:

while (ss.get(c)) { 
    cout << "char: " << c << endl; 
} 
+0

,這裏您依賴於定義了運算符bool()的標準流的便利性。 – wilhelmtell

+0

非常感謝您的快速回復和詳細解釋。 – Chris

2

它因爲循環的順序。您閱讀\ 0和EOF。

重新排序這樣的代碼

int main() { 
    stringstream ss("hello"); 
    char c; 

    ss.get(c); 
    while(!ss.eof()) { 
     cout << "char: " << c << endl; 
     ss.get(c); 
    } 
    return 0; 
} 
+0

你在哪裏看到\ n? – leiz

+1

oooops .. typo ..我在想\ 0並輸入\ n .. –

1

,如果你嘗試讀取過去的結束的EOF標誌只設的文件。以下代碼通過在get()而不是之前測試EOF來修復問題:

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

int main() { 
    stringstream ss("hello"); 
    char c; 

    while(1) { 
     ss.get(c); 
     if(ss.eof()) 
      break; 

     cout << "char: " << c << endl; 
    } 
    return 0; 
}