Вывод в строку вместо wofstream

Для следующего кода можно ли вывести результат в строку вместо wofstream? Спасибо вам!

wstring w = L"test";
std::wofstream ofs("test.txt");
std::locale utf8_locale(std::locale(), new boost::archive::detail::utf8_codecvt_facet());
ofs.imbue(utf8_locale);
std::copy(w.begin(),w.end(),
    std::ostream_iterator<wchar_t, wchar_t>(ofs));

person echo    schedule 06.09.2012    source источник
comment
en.cppreference.com/w/cpp/io/basic_stringstream   -  person chris    schedule 06.09.2012
comment
Привет, Крис, не могли бы вы уточнить это с помощью кода? Я не знаком с С++   -  person echo    schedule 06.09.2012
comment
std::wostringstream является производным от того же класса, что и std::wofstream, поэтому замена только типа используемой переменной должна быть совместима с другими используемыми вами функциями. Однако Stringstreams поддерживает строку, а не файл (доступ через str()), что должно удовлетворить ваши потребности.   -  person chris    schedule 06.09.2012
comment
Например, std::string output = woss.str();? Еще раз извините за глупый вопрос, откуда вы знаете, что wostringstream и wofstream являются производными от одного и того же класса?   -  person echo    schedule 06.09.2012
comment
Теперь я понимаю. Это также полезно: en.cppreference.com/w/cpp/io   -  person echo    schedule 06.09.2012
comment
Очень. Если вам нужна прямая ссылка, стандарт будет местом для поиска. Хотя с картинками немного проще объяснить :) Просто потому, что я могу, я нашел это в § 27.3/5: The class template specialization basic_ostream<charT,traits> serves as a base class for class templates basic_ostringstream and basic_ofstream.   -  person chris    schedule 06.09.2012


Ответы (1)


Потоки выходных строк — это функция C++, которая ведет себя аналогично потокам выходных файлов в том смысле, что они оба наследуются от std::ostream, а это означает, что вы можете использовать в основном одни и те же функции в обоих. Однако строковые потоки работают со строкой, а не с файлом.

Для вас это означает, что все, что вам нужно сделать (поскольку вы не использовали никаких функций, специфичных для wofstream), это изменить тип ofs на строковый поток:

#include <sstream>
std::wostringstream oss;

Теперь я не мог получить сборку локалей (я их пока не использовал), но их комментирование действительно дало правильные результаты (см. этот тест). Как видите, вы можете получить доступ к строке через функцию str() потока строк.

person chris    schedule 06.09.2012
comment
Верно. Но на самом деле str() возвращает wstring, а не строку... Спасибо за ответ! - person echo; 06.09.2012
comment
@echo, немного понаблюдав, вы обнаружите, что и std::ostringstream, и std::wostringstream на самом деле являются одним и тем же базовым классом, но с другим аргументом шаблона. У первого char, у второго wchar_t. Функция str() возвращает std::basic_string<CharT>, где CharT — аргумент шаблона. Это в основном оценивается как std::string или std::wstring соответственно с точно таким же кодом. Если вы хотите, чтобы весь беспорядок использовал ваш собственный тип char, вы могли бы сказать std::basic_ostringstream<YourType>, чтобы никакие изменения кода не производили правильные типы. - person chris; 06.09.2012