Cout << stringstream

Когда я помещаю что-то в строковый поток, скажем, настоящее число, если я тогда вставляю этот объект stringstream в cout... на что я смотрю?

Обычно я получаю странное число. Это место памяти? Просто любопытно.

Похоже, что комментарий ниже, но вот что я пытаюсь сделать:

string stringIn; 
stringstream holdBuff;
holdBuff << getline(cin, stringIn);
cout << holdBuff; 

В основном, я просто пытался увидеть, как выглядел holdBuff, как только я вставил stringIn. Я пытаюсь, чтобы пользователь вводил строку, а затем я хочу пройти через нее, ища ее содержимое и, возможно, преобразование...

Ответы

Ответ 1

Как вы думаете,

holdBuff << getline(cin, stringIn);

делает. Тип возврата getline является ссылкой на поток (cin) в этом случае. Поскольку нет << принимает std::istream как второй аргумент, компилятор пытается различать конверсий: в С++ 11 std::istream имеет неявное преобразование в bool, а в более раннем С++ - неявное преобразование в std::ios* или что-то подобное (но единственное допустимое использование возвращаемого значения - это преобразуйте его в bool). Таким образом, вы либо выведете 1 (С++ 11), либо случайный адрес (на практике, как правило, адрес потока, но это не гарантируется). Если вы хотите получить результаты звонка getline в std::ostringstream, вам понадобятся две операции (с проверьте наличие ошибок между ними):

if ( !getline( std::cin, stringIn ) )
    //  Error handling here...
holdBuff << stringIn;

Аналогично, чтобы написать содержимое a std::ostringstream,

std::cout << holdBuf.str() ;

- правильное решение. Если вы настаиваете на использовании std::stringstream когда std::ostringstream будет более уместным, вы также можете сделать:

std::cout << holdBuf.rdbuf();

Первое решение предпочтительнее, поскольку оно гораздо более идиоматично.

В любом случае, еще не существует оператора <<, который принимает любой iostream, поэтому вы получаете результаты неявного преобразование в bool или указатель.

Ответ 2

Да, вы, скорее всего, увидите адрес строки.

Если вы хотите отобразить содержащуюся в нем строку, попробуйте

cout << stream.str();

Ответ 3

Да, скорее всего, это место памяти той или иной формы. Скорее всего, это указатель на объект stringstream.

Вы можете подтвердить это следующим образом:

std::stringstream ss;
unsigned long long ll = (unsigned long long)&ss;
cout << ll;

Если вы хотите использовать строковый поток, вы должны использовать функцию str() следующим образом:

cout << ss.str();

Ответ 4

cout << s.rdbuf();

- это то, что вы хотите. Кроме того, вы можете захотеть

count << s.str();

который может быть более дорогим с точки зрения ресурсов.