zeile mit getline holen und mit einem string vergleichen



  • Heyho Community.
    ich habe mich gerade mit folgendem Problem rumgeärgert:
    Ich habe mir via getline() eine Zeile aus einer Datei geholt (diese Zeile ist die einzige, also wird eof gesetzt).
    Nun entferne ich alle Leerzeichen mit dem Erase-remove idiom.
    Die strings sehen nun im QuickWatch identisch aus, nichts desto trotz schlägt der Vergleich mit basic_string.compare() fehl und ich habe keine Ahnung wieso.
    Hier mein Code:

    CString input_key(m_strOldLicenseKey); // enthält keine Leerzeichen!
    ifstream LicFile("myfile");	
    
    if(!LicFile.bad())
    {
       string KeyFromFile;
       getline(LicFile, KeyFromFile); // als delimiter wird demnach standardmäßig '\n' genommen
    
       // KeyFromFile ist jetzt "123456   "
    
       // leerzeichen entfernen
       KeyFromFile.erase(remove(KeyFromFile.begin(), KeyFromFile.end(), ' '), KeyFromFile.end());
    
       // KeyFromFile ist jetzt "123456"
    
       if(LicFile.rdstate() == ios::goodbit || LicFile.rdstate() == ios::eofbit)
       {
          if(KeyFromFile.compare(input_key) == 0) // dieser Vorgang schlägt fehl
          {
               // success
          }
       }
    }
    

    Hat jemand eine Idee?


  • Administrator

    1. Was heisst "schlägt fehlt"? Gibt es nicht 0 zurück? Was gibt es dann zurück?
    2. Wenn du schon die MFC verwendest, wieso verwendest du dann nicht gleich auch CStdioFile ?

    Grüssli



  • Hey,
    Danke für deine Antwort.

    Compare liefert 1 zurück.

    ... und ich weiß nun auch warum:
    Die Länge der Strings ist um 1 verschieden, während das CString Objekt "input_key" nur 33 Zeichen hat, enthält das basic_string Objekt "KeyFromFile" 34 Zeichen, hier wird das Stringendezeichen ('\0') mitgezählt und ebenfalls mit zum Vergleich heran gezogen, daher sind sie immer unterschiedlich.

    Meine Lösung sieht wie folgt aus, indem ich einfach nur den Vergleich ändere:

    if(input_key.Compare(KeyFromFile.data()) == 0)
    {
        // success
    }
    

    Danke für den Beitrag!


Anmelden zum Antworten