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