将std::ostream转换为std::string

8
我负责维护的旧代码将文本收集到一个 std::ostream 中。现在,我想将其转换为 std::string
我找到了一些将 std::sstringstreamstd::ostringstream 等类型转换为 std::string 的示例,但没有针对 std::ostream 转换为 std::string 的明确方法。
请问该怎么做呢?(仅限古老的 C++ 98,无需使用 Boost)

4
std::ostream 中,你不能“收集”任何东西,它是一个基类,你需要传递其引用,而引用必须指向一个实际可实例化的输出流。因此,跟随调用链以查看你的 std::ostream 引用实际引用的是什么,如果是 std::ostringstream 则可以轻松从中提取数据。如果是其他类型,则需要使用其他方法来获取输出(例如添加并行写入到 实际std::ostringstream 中)。 - Some programmer dude
谢谢!这解释了很多事情。 - Danny
我简直不敢相信没有人能解决这个问题:如何将std::basic_ostream的内容复制到std::string中?这个问题的答案解释了我遇到的根本问题:gcc在stringstream中没有提供str()函数,而clang和msvc有。那么gcc用户该怎么做才能得到字符串呢? - taranaki
2个回答

6
  • 如果您有一个stringstreamostreamstring的对象或引用,只需使用ostringstream::str()方法,它会完全符合您的要求:提取一个string。但是您知道,您显然拥有一个ostream对象,而不是stringstreamostreamstring

  • 如果您的ostream引用实际上是ostringstreamstringstream,请使用ostream::rdbuf获取一个streambuf,然后使用此帖子查看如何提取一个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

  • 最后,正如M.M所评论的那样,如果你的ostream是一个ofstream或者iostream,很可能它会清空它的缓冲区,因此你可能无法像上面提出的那样提取完整内容。

我认为这并不起作用。您链接的帖子是指输入流的rdbuf - M.M
@M.M:刚刚测试了一下(请参见我帖子中添加的实时演示),当ostream实际上是一个stringstream时,它可以正常工作,所以我不明白为什么它不能与其他类型(如ofstream)一起使用。 - jpo38
字符串流始终将内容保存在内存中,而输出流则不会。我期望它们在写入当前行或其他内容后清除其缓冲区。 - M.M
@M.M:你可能是对的,我评论了我的帖子来提到这一点。也许当ostream实际上不是ostringstream时,答案就不起作用了... - jpo38

1
尝试这个。
 std::ostringstream stream;
 stream << "Some Text";
 std::string str =  stream.str();

顺便说一下,OP说“我已经找到了将std::ostringstream转换为std::string的示例”,所以他知道... - jpo38

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接