2015-10-18 4 views
3

Я только что прочитал о stringstream в C++ и реализовал простую программу.Строка string для целочисленного преобразования в C++

#include <iostream> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    int num; 
    stringstream sso; 
    string str; 

    //integer to string 
    cin >> num; 
    sso << num; 
    sso >> str; 
    cout << "String form of number : " << str << endl; 

    //string to integer 
    cin >> str; 
    sso << str; 
    sso >> num; //num still has value from previous integer to string???? 
    cout << "Integer form of string (+2) :" << (num + 2) << endl; 
    return 0; 
} 

Вот результат:

12 
String form of number : 12 
44 
Integer form of string (+2) :14 

Я получаю неправильный вывод, как num не получает обновления и до сих пор держит старое значение из предыдущего расчета. Какую глупую ошибку я делаю?

ответ

3

Вы должны очистить stringstream между использованием, поскольку eofbit был установлен во время первого использования:

sso.clear(); 
sso.str(""); 
+0

Спасибо. Это сработало. Но когда я сделал 'sso << str;' второй раз в 'string to integer',' 'sso' удерживать оба значения: current, а также предыдущие потоки? –

+0

@InsaneCoder думает, что он должен потерпеть неудачу и просто сохранит предыдущее значение (12) –

+1

Да, он терпит неудачу. Я поставил чек в ответ на @Ulrich и подтвердил его. Благодаря Джерому и Ульриху –

4

После первой операции ввода строковый поток получает свой бит EOF-бит. Этот бит является липким, т. Е. Он не стирается, добавляя больше ввода для синтаксического анализа. Как правило, когда вы читаете данные, вы также должны убедиться, что чтение было успешным. Для потоков, вы можете проверить состояние потока с помощью этого:

if(!(istream >> value)) throw runtime_error("reading failed"); 

Я уверен, что ваша вторая операция ввода просто не удается, и в этот момент значение сохраняет свое прежнее значение.