2014-02-03 1 views
1

С std::stringstream - это строчка, и в соответствии с documention здесь вы можете выполнять любую операцию, поддерживаемую потоком.std :: stringstream поддерживает только один вход за раз?

Так что я ожидал, что следующий образец будет работать, но, похоже, это не так. Я использую MingW с gcc 4.8.3.

Вариант А:

std::string s; 
std::stringstream doc; 
doc << "Test " << "String "; 
doc << "AnotherString"; 
doc >> s; 
std::cout << s << std::endl; 

Вариант B:

std::string s; 
std::stringstream doc; 
doc << "Test "; 
doc << "AnotherString"; 
doc >> s; 
std::cout << s << std::endl; 

Выход это только

Test 

В то время как я ожидал, что он будет сцеплять индивида строки Я читал из потока, что я там положил.

Итак, каков подходящий способ конкатенации строк? Нужно ли мне читать каждый отдельно и конкатенировать их вручную, что мне кажется довольно неудобным в C++.

+0

'поток >> s' читает только одно слово из потока. Неважно, какой поток это. Используйте 'getline', если вам нужна целая строка вместо одного слова. – Barmar

ответ

2

Это ставит каждой из строк в doc, так что его содержание:

Test String AnotherString 

Затем, когда вы извлекаете с помощью doc >> s, он читает только до первого пробела. Если вы хотите, чтобы весь поток в виде строки, вы можете вызвать str:

std::cout << doc.str() << std::endl; 
+0

@Devolus Если вы знаете, что все это будет одна строка в потоке, вы можете сделать 'std :: getline (doc, s);'. Если нет, вы можете сделать 'std :: istreambuf_iterator eos; std :: string s (std :: istreambuf_iterator (doc), eos); 'для получения всего содержимого потока. –

+0

Да, это только одна строка за цикл. Я нашел ответ hwo, чтобы очистить поток здесь: http://stackoverflow.com/questions/20731/in-c-how-do-you-clear-a-stringstream-variable, поэтому для полноты было бы неплохо добавить это ссылку на ответ, так как поведение q бит разное, как можно было бы ожидать, если поток не будет чистым при чтении содержимого. Я полагаю, что getline это делает? – Devolus

+0

@Devolus 'getline' будет извлечен. Конечно, вы можете сделать 'str()', а затем очистить, это одно решение. –

1

Он будет читать только одно слово до белого пространства с помощью stream >> s. Кроме @ JosephMansfield Ответит использование str(), в качестве альтернативы вы можете использовать getline() (отлично работает, если вам строка не содержит новые строки):

getline(doc, s); 
Смежные вопросы