2017-03-18 1331 views
0

我保留的傳統代碼將文本收集到std::ostream中。我想將其轉換爲std::string將std :: ostream轉換爲std :: string

我發現轉換std::sstringstreamstd::ostringstream等,以std::string但沒有明確std::ostreamstd::string的例子。

我該怎麼做? (古C++ 98只,無升壓請)

+4

你不能「收集」任何東西[[std :: ostream']](http://en.cppreference.com/w/cpp/io/basic_ostream),它是一個基類,它的引用一個傳遞,並且引用某處必須引用一個實際的可實例化的輸出流。因此,請按照調用鏈查看您的'std :: ostream'引用實際引用了什麼,如果它是'std :: ostringstream',那麼您可以輕鬆地從中提取數據。如果它是別的東西,那麼你運氣不好,需要使用別的東西來獲得輸出(可能會添加並行寫入* actual *'std :: ostringstream')。 –

+0

謝謝!這解釋了很多事情。 – Danny

回答

2
  • 如果你有AA stringstreamostreamstring,對象或引用,只需使用ostringstream::str()方法,你想要做什麼:提取一個string。但是你知道,而且你顯然有一個ostream對象,而不是stringstream也不是ostreamstring

  • 如果您ostream的引用實際上是一個ostringstreamstringstream,使用ostream::rdbuf獲得streambuf是,然後使用this post來看看如何提取string

例子:

#include <iostream> 
#include <sstream> 

std::string toString(std::ostream& str) 
{ 
    std::ostringstream ss; 
    ss << str.rdbuf(); 
    return ss.str(); 
} 

int main() { 

    std::stringstream str; 
    str << "Hello"; 

    std::string converted = toString(str); 

    std::cout << converted; 

    return 0; 
} 

現場演示:http://cpp.sh/6z6c

  • 最後,MM的評論,如果您ostreamofstreamiostream,最有可能清除其緩衝區,以便您可能無法提取上述建議的全部內容。
+0

我不認爲這有效;你鏈接到的帖子引用輸入流的'rdbuf'。 –

+0

@ M.M:剛剛測試過(見現場演示添加到我的文章中),它在'ostream'實際上是一個'stringstream'時有用,所以我不明白爲什麼它不會與其他人一起工作(如'ofstream')。 – jpo38

+0

stringstreams總是將內容保存在內存中,而ofstreams不會,我希望他們在寫入當前行或其他內容後清除它們的緩衝區。 –

0

試試這個

std::ostringstream stream; 
stream << "Some Text"; 
std::string str = stream.str(); 
+0

OP的ostream也可能是... ...誰知道? – jpo38

+0

順便說一句,OP說'我找到了將std :: ostringstream轉換爲std :: string'的例子,所以他知道... – jpo38

相關問題