Некоторая справочная информация, для задания домашней работы Мне пришлось написать калькулятор латинских обозначений с использованием двоичных деревьев, для этого мне пришлось анализировать ввод командной строки, чтобы он правильно построил двоичное дерево и затем перейдите к нему, чтобы дать правильный ответ на введенное математическое выражение.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
Может быть, вы, ребята, будете видеть что-то я пропустил, или, если это действительно ошибка выше за моей программы, в этом случае указатели о том, где доклад это было бы весьма признателен.
Однако в этот момент символ + не был прочитан, так как он никогда не извлекается из потока, так как он не является допустимым числом. Почему указатель чтения перемещается вперед, когда он не работает? –
Я боюсь, это волшебство потока. Вы должны иметь дело с вещами такими, какие они есть, а не так, как вы хотели бы, чтобы они были. – 2009-03-12 02:23:31
X-Istence Я думаю, что он извлекается, потому что «+» является действительной частью положительного числа. как «+10». во всяком случае, это не должно быть «seekg» (искать get) вместо «seekp» (искать put)? –