2009-03-12 2 views
0

Некоторая справочная информация, для задания домашней работы Мне пришлось написать калькулятор латинских обозначений с использованием двоичных деревьев, для этого мне пришлось анализировать ввод командной строки, чтобы он правильно построил двоичное дерево и затем перейдите к нему, чтобы дать правильный ответ на введенное математическое выражение.std :: stringstream странное поведение

Для разбора я использовал std :: stringstream, чтобы я мог легко преобразовать std :: string, которую я передал в действительный float (или integer, double). Проблема, с которой я столкнулся, - это следующий код, в котором показана ошибка и как я решил проблему. Я надеялся, что кто-нибудь, кто сможет сказать мне, что я делаю что-то неправильно, и .clear() неверно, или если это ошибка в стандартной библиотеке в том, как она обрабатывает этот конкретный вход (происходит только для + а также -).

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

int main() { 
    std::string mystring("+"); 
    int num; 
    char op; 

    std::stringstream iss(mystring); 
    iss >> num; 

    // Seems it is not a number 
    if (iss.fail()) { 
      // This part does not work as you would expect it to 

      // We clear the error state of the stringstream 
      iss.clear(); 
      std::cout << "iss fail bit: " << iss.fail() << std::endl; 
      iss.get(op); 
      std::cout << "op is: " << op << " iss is: " << iss.str() << std::endl; 
      std::cout << "iss fail bit: " << iss.fail() << std::endl; 

      // This however works as you would expect it to 
      std::stringstream oss(iss.str()); 
      std::cout << "oss fail bit: " << oss.fail() << std::endl; 
      oss.get(op); 
      std::cout << "op is: " << op << " oss is: " << oss.str() << std::endl; 
      std::cout << "oss fail bit: " << oss.fail() << std::endl; 

    } else { 
      // We got a number 
    } 
} 

Пример вывода из программы:

iss fail bit: 0 
op is: iss is: + 
iss fail bit: 1 
oss fail bit: 0 
op is: + oss is: + 
oss fail bit: 0 

Может быть, вы, ребята, будете видеть что-то я пропустил, или, если это действительно ошибка выше за моей программы, в этом случае указатели о том, где доклад это было бы весьма признателен.

ответ

4

Когда вы говорите:

iss.clear(); 
    std::cout << "iss fail bit: " << iss.fail() << std::endl; 
    iss.get(op); 

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

iss.clear(); 
    iss.seekg(0); // start again 
    std::cout << "iss fail bit: " << iss.fail() << std::endl; 
    iss.get(op); 
+0

Однако в этот момент символ + не был прочитан, так как он никогда не извлекается из потока, так как он не является допустимым числом. Почему указатель чтения перемещается вперед, когда он не работает? –

+0

Я боюсь, это волшебство потока. Вы должны иметь дело с вещами такими, какие они есть, а не так, как вы хотели бы, чтобы они были. – 2009-03-12 02:23:31

+0

X-Istence Я думаю, что он извлекается, потому что «+» является действительной частью положительного числа. как «+10». во всяком случае, это не должно быть «seekg» (искать get) вместо «seekp» (искать put)? –

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