2012-01-11 197 views
14

當我把一些東西放到一個stringstream中時,讓我們說一個實數,如果我然後將該stringstream對象插入到cout中...我在看什麼?cout << stringstream

通常我會得到一些奇怪的數字。這是一個存儲位置嗎?只是好奇。

它看起來像下面的評論打它,但這裏是我想要做的事:

string stringIn; 
stringstream holdBuff; 
holdBuff << getline(cin, stringIn); 
cout << holdBuff; 

基本上我只是想看看有什麼holdBuff看起來像有一次我插入stringIn。我試圖讓用戶輸入一個字符串,然後我想通過它尋找它的內容和可能轉換...

回答

19

你覺得呢

holdBuff << getline(cin, stringIn); 

正在做。在這種情況下,返回類型getline是對正在讀取的流 的引用(cin)。因爲沒有定義<<其中 接受一個std::istream作爲第二個參數,編譯器試圖不同 轉化:在C++ 11,std::istream具有隱式轉換到 bool,並且在較早的C++,一個隱式轉換到std::ios*,或 東西類似(但是返回值的唯一有效用途是將其轉換爲) 。因此,您將輸出1(C++ 11)或一些 隨機地址(實際上,通常是流的地址,但不保證此 )。如果你想獲得 getline一個調用的結果爲std::ostringstream,你需要兩個操作(與它們之間的 檢查錯誤):

if (!getline(std::cin, stringIn)) 
    // Error handling here... 
holdBuff << stringIn; 

同樣,寫的std::ostringstream

內容
std::cout << holdBuf.str() ; 

是正確的解決方案。如果你堅持使用std::stringstreamstd::ostringstream會更合適,你也可以這樣做:

std::cout << holdBuf.rdbuf(); 

第一個解決方案是優選的,但是,因爲它是更地道。

在任何情況下,再一次,沒有<<操作員採取任何 iostream類型,所以你最終的隱含 轉換的結果bool或指針。

+0

非常感謝詹姆斯。偉大的信息。我將不得不查找ostringstream與stringstream之間的區別。這是一種好的/入門級的方式來拉入一系列可能的混合類型嗎?謝謝。 – MCP 2012-01-12 07:46:17

2
cout << s.rdbuf(); 

是你想要的。或者,你可能想要

count << s.str(); 

雖然它可能在資源方面更昂貴。

13

是的,你很可能會看到stringstream的地址。

如果你想顯示它包含字符串,嘗試

cout << stream.str(); 
+0

由於str()按值返回,因此會創建緩衝區的副本。 – 2012-01-11 17:50:49

5

是的,它是最有可能的某種形式的存儲位置。很可能它是指向stringstream對象本身的指針。

你能否確認這個消息如下:

std::stringstream ss; 
unsigned long long ll = (unsigned long long)&ss; 
cout << ll; 

時要清點一個字符串流,你應該按如下方式使用STR()函數,它說:

cout << ss.str(); 
相關問題