Конвертировать std :: ostringstream в std :: stringstream - PullRequest
1 голос
/ 16 апреля 2020

Следующий код возвращает пустую строку в 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.

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Вы можете использовать защищенную функцию-член 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
}
0 голосов
/ 20 апреля 2020

После комментариев от @ NathanOliver я решил преобразовать std :: ostringstream в std :: stringstream , используя str () :

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

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

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