2017-01-13 13 views
0

Я пытаюсь понять детали stringstream в C++. Но я нахожу проблему, когда пытаюсь повторно ввести («< <») объект строкового потока. (т. е. содержание объекта obj остается неизменным.) Мой код выглядит следующим образом. Выводы показаны в комментариях.C++: Почему повторный ввод stringstream не работает? содержимое остается тем же

#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    stringstream sso; 
    cout <<"orginal: " << sso.str() <<endl; //orginal:"empty" 
    sso << "A" << " " << "B" << " " << "C"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    string r1, r2, r3; 
    sso >> r1 >> r2 >> r3; 
    cout << "flowout:" << r1 << r2 << r3 << endl;//flowout:ABC 
    cout << "base: " << sso.str() << endl; //base: A B C 

    cout << "----problem here-----" << endl; 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:A B C 

    cout << "----this works-----" << endl; 
    sso.clear(); //clear flag 
    sso.str(""); //clear content 
    sso << "D" << " " << "E" << " " << "F"; 
    cout <<"flowin:" << sso.str() <<endl; //flowin:D E F 

    return 0; 
} 

Почему? Я не понимаю результат в «--- проблема здесь ---». Почему sso не принимает новые входы?

Apprecited,

ответ

0

последнее чтение sso >> r1 >> r2 >> r3; помещает поток в состоянии терпеть неудачу, потому что нет больше символов, не были доступны в то время как он все еще пытается читать больше символов для r3.

В состоянии сбоя поток не может быть записан или прочитан. Чтобы устранить проблему, переместите sso.clear(); до sso << "D".

Вы можете увидеть другое поведение, если вы выведете дополнительное пространство после C, потому что тогда поток не входит в состояние отказа (он успешно читает r3, пока в потоке еще есть место).

+0

Большое спасибо. :) –

 Смежные вопросы

  • Нет связанных вопросов^_^