2017-06-19 1 views
0

Malheureusement this n'a pas été utile ...opérateur istringstream >> valeur de retour

J'ai un logiciel qui lance une exception mis en œuvre, mais je dois savoir comment éviter. Voici la partie spécifique:

if (!(iss >> c)) { 
    throw std::runtime_error(
     "No return code: status line doesn't begin with return code"); 
} 

Et c'est toute la méthode.

void parseReply(std::ostream& os, std::istream& is, std::string &strReturn) { 

std::string s; 
int  c; 

while (std::getline(is, s)) { 
    strReturn += s; 
    strReturn += '\n'; 

    std::istringstream iss(s); 
    if (!(iss >> c)) { 
     throw std::runtime_error(
      "No return code: status line doesn't begin with return code"); 
    } 

    if (CODE_OK == c 
     || CODE_ERROR == c 
     || CODE_BUSSY == c 
     || CODE_UNKNOWN_CMD == c 
     ) { 
     break; 
    } 
} 

if (CODE_OK != c 
    && CODE_UNKNOWN_CMD != c 
    && CODE_BUSSY != c 
    ) { 
    throw std::runtime_error("error: " + s); 
} 

while (is >> s) {  
    flyelite::util::chop(s);   
    strReturn += s; 
    if (">" == s) {   
     return; 
    } 
} 

return; 

La méthode analyse le contenu de données d'une réponse de message tcp. Chaque message est reconnu avec un caractère ">".

La question est maintenant, que parfois (surtout quand un bon nombre de messages sont dans la boucle) le contenu de iss est:

"> 250 Alright"

Le format correct serait être

"250 Alright"

  • Pourquoi (iss >> c) renvoie lorsque le premier contenu de iss est un ">"?
  • Est-il possible que l'expéditeur ait renvoyé un deuxième ">" dans sa réponse?

Merci à l'avance

Répondre

2

Pourquoi (iss >> c) return false lorsque le premier contenu de iss est un ">"?

Les iss >> c renvoie un faux lorsque le personnage qui a été lu est « > » parce qu'il attend un entier et veut affecter la valeur à la c variable quand il est incapable de trouver un tel entier, alors le istream entre dans un état d'erreur.

Est-il possible que l'expéditeur ait renvoyé un second ">" dans sa réponse?

Il est probable que la gauche sur la valeur du flux d'entrée que vous n'êtes pas en mesure de lire (à cause de la raison ci-dessus) que vous voyez dans votre « état »

+1

Merci @Curious, de sorte que le operator >> est sensible au type 'target' ... sympa –