Различия stringstream и ostringstream
Я тестировал приведенный ниже фрагмент, но он не дает желаемого результата:
#include<iostream>
#include<sstream>
using namespace std;
void MyPrint(ostream& stream)
{
cout<<stream.rdbuf()<< endl;
}
int main()
{
stringstream ss;
ss<<"hello there";
MyPrint(ss); //Prints fine
ostringstream oss;
oss<<"hello there";
MyPrint(oss); //Does not print anything
getchar();
}
Я знаю, что единственными возможными различиями между stringstream
и ostringstream
являются то, что позже сила направления и немного быстрее, чем stringstream
.
Я что-то пропустил?
PS: аналогичный вопрос был опубликован ранее, но ответа не получил.
Ответы
Ответ 1
std::stringstream
и std::ostringstream
проходят разные
флаги std::stringbuf
. В частности,
std::stringbuf
std::ostringstream
не поддерживает
чтение. И std::cout << stream.rdbuf()
- операция чтения
на streambuf.
Способ извлечения символов из std::ostringstream
равен
используя функцию std::ostringstream::str()
.
Ответ 2
stringstream не следует рассматривать как двунаправленную реализацию ostringstream и istringstream. Он реализован как класс derrive как ostringstream, так и istringstream, поэтому он реализует как входные, так и выходные возможности.
Выбор того, какой из них использовать, зависит от того, для чего он используется. Если вам нужно только записать данные в поток, не имея возможности получить доступ к данным через поток, тогда вам понадобится ostringstream. Однако, если вы хотите реализовать двунаправленную информацию о том, что вы предоставляете API, но ограничите ее, вы можете сделать это:
stringstream ss; // My bidirectional stream
ostringstream *p_os = &ss; // Now an output stream to be passed to something only allowed to write to it.
int bytes = collectSomeData(p_oss);