cout << струйный поток - PullRequest
       7

cout << струйный поток

19 голосов
/ 11 января 2012

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

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

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

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

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

Ответы [ 4 ]

22 голосов
/ 11 января 2012

Что вы думаете

holdBuff << getline(cin, stringIn);

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

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

Аналогично, для записи содержимого std::ostringstream,

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

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

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

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

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

20 голосов
/ 11 января 2012

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

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

cout << stream.str();
6 голосов
/ 11 января 2012

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

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

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

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

cout << ss.str();
2 голосов
/ 11 января 2012
cout << s.rdbuf();

это то, что вы хотите. В качестве альтернативы вы можете захотеть

count << s.str();

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

...