Quelques informations de base, pour une tâche de devoirs Je devais écrire une calculatrice de notation polonaise en utilisant des arbres binaires, pour que cela fonctionne, je devais analyser l'entrée de ligne de commande pour construire correctement l'arbre binaire et Ensuite, passez-le pour donner une réponse valide à l'expression mathématique qui a été entrée. Pour l'analyse, j'ai utilisé un train de chaînes std :: de sorte que je puisse facilement convertir la chaîne de caractères std :: string en un flottant valide (ou entier, double). Le problème que j'ai rencontré était le code suivant, qui présente l'erreur et comment j'ai résolu le problème. J'espérais que quelqu'un serait capable de me dire si je faisais quelque chose de mal et .clear() n'est pas correct, ou si c'est un bogue dans la bibliothèque standard dans la façon dont il gère cette entrée particulière (seulement pour + et -).std :: stringstream comportement étrange
#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
}
}
Exemple de sortie du programme:
iss fail bit: 0
op is: iss is: +
iss fail bit: 1
oss fail bit: 0
op is: + oss is: +
oss fail bit: 0
Peut-être que vous les gars vont voir quelque chose que je manqué, ou si cela est en effet un bug plus haut au-delà de mon programme, dans lequel les pointeurs cas à l'endroit où signaler ce serait grandement apprécié.
Cependant, à ce stade, le + n'a pas été lu car il n'est jamais extrait du flux car il ne s'agit pas d'un nombre valide. Pourquoi le pointeur de lecture est-il déplacé lorsqu'il échoue? –
C'est la magie du flux I/O, j'ai peur. Vous devez gérer les choses telles qu'elles sont, pas comme vous le voudriez. –
X-Istence je pense qu'il est extrait car "+" est une partie valide d'un nombre positif. comme "+10". de toute façon ne devrait-il pas être "seekg" (chercher obtenir) au lieu de "seekp" (chercher mis)? –