2009-03-12 5 views
0

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é.

Répondre

4

Quand vous dites:

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

vous essayez de lire quelque chose qui a déjà été lu. Vous devez réinitialiser le pointeur de lecture des flux:

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

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? –

+0

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. –

+0

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)? –