2012-01-11 5 views
14

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

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

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

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

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

ответ

19

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

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 или указатель.

+0

Большое спасибо Джеймсу. Отличная информация. Мне придется искать разницу между ostringstream и stringstream. Это хороший/начальный уровень, способный вытягивать линию возможных смешанных типов? Благодарю. – MCP

2
cout << s.rdbuf(); 

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

count << s.str(); 

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

13

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

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

cout << stream.str(); 
+0

создает копию буфера, так как str() возвращает значение. –

5

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

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

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

что сказал, когда вы хотите COUT в stringstream вы должны использовать функцию Обл() следующим образом:

cout << ss.str(); 
Смежные вопросы