2017-06-19 3 views
0

Leider this war nicht hilfreich ...istringstream Operator >> Rückgabewert

Ich habe eine Software, die eine Ausnahme als implementiert wirft, aber ich muss wissen, wie es zu vermeiden. Hier ist der spezifische Teil:

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

Und das ist die ganze Methode.

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; 

Die Methode analysiert den Dateninhalt einer TCP-Nachrichtenantwort. Jede Nachricht wird mit einem ">" Zeichen bestätigt.

Das Problem ist jetzt, dass manchmal (vor allem, wenn ein viele Nachrichten in der Schleife) sind der Gehalt an iss ist:

"> 250 Alright"

Das richtige Format würde sein

"250 Alright"

  • Warum gibt (iss >> c)false zurück, wenn der erste Inhalt von iss ein ">" ist?
  • Ist es möglich, dass der Absender ein zweites ">" in seiner Antwort zurückgegeben hat?

Vielen Dank im Voraus

Antwort

2

Warum (iss >> c) return false, wenn der erste Inhalt iss ein ">" ist?

Die iss >> c kehrt ein falsch, wenn das Zeichen, das eine „>“ in ist, weil es erwartet eine ganze Zahl und will zuweisen den Wert der Variablen c, wenn es nicht in der Lage ist zu finden, so eine ganze Zahl gelesen wurde, dann geht die istream in einen Fehlerzustand.

Ist es möglich, dass der Absender ein zweites ">" in seiner Antwort zurückliefert?

Es ist wahrscheinlich nur links über Wert aus dem Eingangsstrom, den Sie nicht in der Lage waren, zu lesen in (wegen des oben genannten Grundes), die Sie in Ihrem „Zustand“ sehen

+1

Dank @Curious, so dass die Operator >> ist empfindlich auf den 'Ziel' Typ ... schön –