Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Перенаправление с ostream в строку


Автор: CPlusPlusFAN 26.8.2010, 23:57
Здравствуйте.

Есть у меня поток типа std::ostream. Необходимо с ним что-то сделать, чтобы весь вывод на него попадал в какую-нибудь переменную типа std::string.

Что-то типа:
Код

#include <iostream>
#include <string>

void redirect(std::ostream & from, std::string & to)
{
// ???
}

int main(int, char **)
{
std::string text;
redirect(std:cout, text);

std::cout << "Supposed to be in cout" << std::endl;
// на stdout пусто
std::cerr << text;
// на stderr:
// Supposed to be in cout

return 0;
}

Автор: 586 27.8.2010, 01:42
Цитата(CPlusPlusFAN @  27.8.2010,  00:57 Найти цитируемый пост)
Есть у меня поток типа std::ostream. Необходимо с ним что-то сделать, чтобы весь вывод на него попадал в какую-нибудь переменную типа std::string.

Используй std::ostringstream.
Код
#include <iostream>
#include <sstream>

int main()
{
  std::ostringstream oss;
  
  oss << "your text" << std::endl;
  
  std::cerr << oss.str();
  return 0;
}

Автор: Леопольд 27.8.2010, 08:46
http://codepad.org/xcLTmA52
Код
#include <iostream>
#include <sstream>

std::ostream* outP;

int main(int, char **)
{
   outP = &std::cout;
   *outP << "to be in cout\n" << std::flush;

   outP = &std::cerr;
   *outP << "to be in cerr\n" << std::flush;

   std::stringstream sout;
   outP = &sout;
   *outP << "to be in sout\n" << std::flush;

   assert(sout.str() == "to be in sout\n");

   return 0;
}

Автор: azesmcar 27.8.2010, 09:04
http://www.java2s.com/Tutorial/Cpp/0240__File-Stream/Redirectouputintothefile.htm

Автор: Леопольд 27.8.2010, 09:12
Есть ещё http://cplusplus.com/reference/iostream/ios/tie/:
Код
#include <iostream>
#include <sstream>
#include <cassert>

std::ostream* outP;

int main(int, char **)
{
    std::ostringstream sout;
    std::ostream* backup = std::cout.tie(&sout);

    *std::cout.tie() << "to be in std::sout\n" <<std::flush;

    std::cout.tie(&std::cerr);
    *std::cout.tie() << "to be in std::cerr\n" << std::flush;

    std::cout.tie(backup);

    assert(sout.str() == "to be in std::sout\n");

    return 0;
}

Автор: CPlusPlusFAN 27.8.2010, 10:16
Вариант:
Код

#include <sstream>
#include <iostream>


void redirect(std::ostream & from, std::ostringstream & to)
{
    from.rdbuf(to.rdbuf());
}

int main(int, char **)
{
    std::ostringstream stream;
    redirect(std::cout, stream);

    std::cout << "Supposed to be in cout" << std::endl;
    std::cerr << stream.str();
    
    return 0;
}


работает. В stdout пусто, а в stderr моя строка.

azesmcar, +1

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)