std :: stringstream странное поведение - PullRequest
0 голосов
/ 12 марта 2009

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

Для синтаксического анализа я использовал std :: stringstream, чтобы я мог легко преобразовать std :: string, которую мне передали, в допустимое число с плавающей точкой (или целое число 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

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

1 Ответ

4 голосов
/ 12 марта 2009

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

  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);
...