2013-03-03 2 views
2

Я создаю простой синтаксический парсер с использованием C++, и я пытаюсь использовать istream >>, чтобы проверить, вводя ли я число или символ.C++: istringstream

вход:

a = 10 
b = a 

parser.cpp:

string inputLine, varLeft, equal, varRight; 
double varValue 
// please see update below 
while(getline(cin, inputLine)){ 
    istringstream stringSplitter(inputLine); 
    stringSplitter >> varLeft >> equal; 

    if(!(stringSplitter >> varValue)){ 
     stringSplitter >> varRight; 
    } 
}  

Цель, позже в коде, если varRight пуст, я полагаю, что строка ввода был double буквальным, в противном случае это строка, обозначающая переменную. Я понимаю, что могут быть логические ошибки, связанные со смешанным вводом, начинающимся с цифр, но я предполагаю, что все входные данные теперь правильно отформатированы. Почему a во второй строке ввода отбрасывается? Какое решение вы предлагаете?

Update

Проблема не с утверждением, в то время как петли, то с утверждением, если в конце кодового блока в то время.

В фактическом коде цикл не является циклом while; Я использую векторный объект, содержащий строковые команды, и итерацию через них с помощью цикла for, который проходит через вектор, используя итераторы. Но, чтобы угодить комментаторам, я исправил его выше.

ответ

3

Если входная функция не работает, поток не позволит больше выполнять экстракции, пока вы не очистите состояние отказа. Вы должны будете сделать это, после того как вы проверили, что вход varValue не удалось, с std::basic_ios::clear:

if(!(stringSplitter >> varValue)){ 
    stringSplitter.clear(); 
    stringSplitter >> varRight; 
} 

Я не знаю, как вы делаете /* not end of input */ в данный момент (надеюсь, вы не проверка eof()), но рекомендуется, что вы делаете:

while (getline(cin, inputLine)) { 
    // ... 
} 

Это проверяет, что входная линия была успешной перед погружением в петлю.

+0

Это сработало отлично. Что касается цикла while, см. Обновление выше. Большое спасибо за Вашу помощь. – naxchange

+0

Но как он проверяет, удалось ли «stringSplitter >> varRight;»? – 0x499602D2

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