首页 > 解决方案 > 将 std::ostringstream 转换为 std::stringstream

问题描述

下一个代码在 ss 中返回一个空字符串:

#include <string>       
#include <iostream>     
#include <sstream>      

int main () {
  std::ostringstream oss;
  oss << "Text";

  std::stringstream ss;
  ss.basic_ios<char>::rdbuf(oss.rdbuf());
  std::cout << ss.str() << "\n";
  return 0;
}

如何从ss返回oss中引入的文字?我主要对将 std::ostringstream 转换为 std::stringstream 感兴趣。

标签: c++streamstringstreamostringstream

解决方案


您可以使用受保护的std::streambuf::swap成员函数来交换流缓冲区的内容与另一个

要访问它,您需要一个派生类:

#include <iostream>
#include <sstream>

struct swapper : std::streambuf {
    using std::streambuf::streambuf;
    void swap(std::streambuf& rhs) {         // public proxy for protected swap
        std::streambuf::swap(rhs);
    }
};

// casting
void swapbuf(std::ostream& a, std::ostream& b) {
    static_cast<swapper*>(a.rdbuf())->swap(*b.rdbuf());
}

int main () {
    std::ostringstream oss;
    oss << "Text";
    std::stringstream ss;
    swapbuf(oss, ss);

    std::cout << "ss:  " << ss.str() << "\n";   // prints Text
}

推荐阅读