Проблема с многократным использованием объекта stringstream

Я пытаюсь использовать безопасные методы в обработке входа с числами только в C++, таким образом, я использую объект stringstream в качестве так:

#include <iostream>
#include <string>
#include <sstream>
using namespace std;

int main()
{
    int first, second;
    string input;

    stringstream sstream;

    cout << "First integer: ";
    getline(cin, input);
    sstream.str(input);
    sstream >> first;

    cout << first << endl; //display user input in integers

    cout << "Second integer: ";
    getline(cin, input);
    sstream.str(input);
    sstream >> second;

    cout << second << endl; //display user input in integers

    getline(cin, input); //pause program

    return 0;
}

Однако второй раз вокруг этого, кажется, дает переменной 'секунде' произвольное значение. Это - вывод:

First integer: 1
1
Second integer: 2
2293592

Если я объявляю два объекта stringstream и использую их соответственно для обеих переменных, это, кажется, хорошо работает. Это означает, что я не могу снова использовать объект stringstream в способе, которым я пытаюсь сделать? В моей реальной программе я намереваюсь обработать намного больше чем два входных значения от пользователя, таким образом, я просто хочу удостовериться, существует ли иначе вместо того, чтобы делать несколько объектов stringstream. Я сомневаюсь, что это имеет большую уместность, но я нахожусь на Windows XP, и я использую MinGW в качестве своего компилятора.

Я значительно ценю любую справку.

9
задан kaykun 27 January 2010 в 02:15
поделиться

4 ответа

Используйте sstream.clear(); после sstream >> сначала;.

13
ответ дан 4 December 2019 в 07:23
поделиться

Лучший способ сделать это преобразование между типорами данных было бы использовать Boost :: Lexical_Cast .

Информация и примеры можно найти на уровне Boost Boost .

Ниже приведен пример выполнения конвертации строки и обратно (строка для INT), таких как то, что вы делаете в вашей программе.

#include <string>
#include <boost/lexcal_cast.hpp>

int main(int argc, char *argv[])
{
    int i = 42;
    std::string s = boost::lexical_cast<std::string>(i);
    int j = boost::lexical_cast<int>(s);

    return 1;
}
4
ответ дан 4 December 2019 в 07:23
поделиться

Вам необходимо сбросить состояние StringStream . Как правило, это включает в себя два шага: очистка буфера:

sstream.str("");

и сброс флагов состояния ошибки:

sstream.clear();

Если вы не очищаете буфер, если вы получите вход «123ABC», то «ABC» все еще будет Поток, когда вы пытаетесь прочитать от него в следующий раз.

Вы также должны обязательно проверить состояние провала потока ( SSEReam.fail () ), чтобы убедиться, что экстракция была успешной. Если вы хотите быть уверены, что пользователь вводил только в целом (т. Е. Вы хотите предотвратить ввод пользователя, скажем, «123ABC», то вам следует проверить, чтобы убедиться SSTReam.eOF () правда.

11
ответ дан 4 December 2019 в 07:23
поделиться
cout << "First integer: ";
getline(cin, input);
sstream.str(input);
sstream >> first;     // state of sstream may be eof

cout << "Second integer: ";
getline(cin, input);
sstream.str(input);
sstream.clear();      // clear eof state
sstream >> second;    // input from sstream
2
ответ дан 4 December 2019 в 07:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: