Frage zu std::string



  • vector<string>data;
    ifstream file(Filename.c_str());
    
            while ( !file.eof() )
            {
              getline(file,str);
              data.push_back(str);
            }
    

    Ist es irgendwie möglich jetzt noch auf einzelene Zeichen zu zugreifen welche in data gespeichert sind?
    Gibt es da vielleicht eine Funktion?



  • Klar:
    data[0] ist ein String (der Erste),
    data[0][0] ist ein Zeichen (das Erste aus dem ersten String).



  • Quak schrieb:

    vector<string>data;
    ifstream file(Filename.c_str());
    
            while ( !file.eof() )
            {
              getline(file,str);
              data.push_back(str);
            }
    

    Ich denke, das macht nicht genau das, was du willst. Der eof-Zustand wird nur dann gesetzt, wenn ein Lesen wegen eof schon fehlschlug. Du willst eher das hier:

    vector<string>data;
    ifstream file(Filename.c_str());
    
            string str;
            while ( getline(file,str) )
            {
              data.push_back(std::move(str));
            }
    

    (wenn ich mich nicht gerade täusche). Das std::move kannst du auch weglassen.

    Quak schrieb:

    Ist es irgendwie möglich jetzt noch auf einzelene Zeichen zu zugreifen welche in data gespeichert sind?

    Ja.


  • Mod

    Eigentlich könnte ich mir mal einen Mustertext zurechtlegen, so oft, wie das kommt 🙄 :

    while ( !file.eof() )
            {
              getline(file,str);
              data.push_back(str);
            }
    

    Du prüfst auf Fehler(sogar nur auf eof), dann liest du, dann verarbeitest du. Was passiert bei einem Lesefehler? Du verarbeitest Müll!

    So sieht das in C++ aus:

    while ( getline(file,str) )
            {
              data.push_back(str);
            }
    

    Prüft auf diese Weise sogar auf alle Fehler, nicht nur eof. Wo auch immer du das her hast, derjenige hat keine Ahnung von C-artigen Sprachen.

    edit: Zu langsam.



  • Wofür braucht man eof überhaupt, so wie es vom Standard definiert ist? Gibt es da auch sinnvolle Anwendungen?



  • Wenn du mit Exceptions arbeitest, empfehle ich dir at() zu verwenden. Also
    data.at(i).at(j)
    Solltest du den gültigen Speicherbereich verlassen, würdest du den out_of_range-Fehler abfangen.



  • Tachyon schrieb:

    Wofür braucht man eof überhaupt, so wie es vom Standard definiert ist? Gibt es da auch sinnvolle Anwendungen?

    Als ganz simples Beispiel:

    while(file >> irgendwas) {
      foo(irgendwas);
    }
    
    if(file.eof()) {
      // Alles OK
    } else {
      // Oh noes, Lesefehler!
    }
    


  • seldon schrieb:

    Tachyon schrieb:

    Wofür braucht man eof überhaupt, so wie es vom Standard definiert ist? Gibt es da auch sinnvolle Anwendungen?

    Als ganz simples Beispiel:

    while(file >> irgendwas) {
      foo(irgendwas);
    }
    
    if(file.eof()) {
      // Alles OK
    } else {
      // Oh noes, Lesefehler!
    }
    

    Hmm, ja hat einigermaßen Sinn...



  • [Rewind] schrieb:

    Wenn du mit Exceptions arbeitest, empfehle ich dir at() zu verwenden. Also
    data.at(i).at(j)
    Solltest du den gültigen Speicherbereich verlassen, würdest du den out_of_range-Fehler abfangen.

    Ich habe die Bereichsprüfung lieber optional. Das bekomme ich hier mit operator[] und einem eingeschalteten Debugmodus von libstdc++.



  • krümelkacker schrieb:

    [Rewind] schrieb:

    Wenn du mit Exceptions arbeitest, empfehle ich dir at() zu verwenden. Also
    data.at(i).at(j)
    Solltest du den gültigen Speicherbereich verlassen, würdest du den out_of_range-Fehler abfangen.

    Ich habe die Bereichsprüfung lieber optional. Das bekomme ich hier mit operator[] und einem eingeschalteten Debugmodus von libstdc++.

    und unter msvc2010 steht da eh ein assert drin... also in jedem fall werden sich range fehler bemerktbar machen



  • Tja, Pech für mich denn ich arbeite mit VS2008.
    Wie auch immer; bei Exceptions gehts nicht nur um Fehler zu Kompilier- sondern auch Laufzeit.



  • da denke ich mal auch. oder anders gefragt, mach doch mal bewusst en zugriffsfehler, greif mal auf vector[-1] und vector[vector.size()+1] zu. dann sollte dein programm geköpft werden und eine schöne meldung von wegen unterbrechen, weiter und abbrechen erscheinen. und genau das ist das assert von msvc...

    edit: ich mein, diese ganzen IDE's sind nicht umsonst zu empfehlen (ja, umsonst sind sie teilweise auch nicht). die helfen dir bei memory leaks, beim debuggen und und und


Anmelden zum Antworten