Ich muss eine ganze Datei in den Speicher einlesen und sie in eine C++ std::string
.
Wenn ich es in eine Tabelle einlesen würde char[]
dann wäre die Antwort sehr einfach:
std::ifstream t;
int length;
t.open("file.txt"); // open input file
t.seekg(0, std::ios::end); // go to the end
length = t.tellg(); // report location (this is the length)
t.seekg(0, std::ios::beg); // go back to the beginning
buffer = new char[length]; // allocate memory for a buffer of appropriate dimension
t.read(buffer, length); // read the whole file into the buffer
t.close(); // close file handle
// ... Do stuff with buffer here ...
Jetzt möchte ich genau das Gleiche tun, aber mit einer std::string
anstelle einer char[]
. Ich möchte Schleifen vermeiden, d. h. ich nicht wollen:
std::ifstream t;
t.open("file.txt");
std::string buffer;
std::string line;
while(t){
std::getline(t, line);
// ... Append line to buffer and go on
}
t.close()
Irgendwelche Ideen?
3 Stimmen
Es wird immer eine Schleife involviert sein, aber sie kann als Teil der Standardbibliothek implizit sein. Ist das akzeptabel? Warum versuchen Sie, Schleifen zu vermeiden?
8 Stimmen
Ich glaube, dass der Poster wusste, dass das Lesen von Bytes eine Schleife erfordert. Er wollte nur eine einfache, Perl-Stil schlucken gleichwertig. Dazu musste ich nur wenig Code schreiben.
0 Stimmen
Dieser Code ist fehlerhaft, für den Fall, dass std::string keinen kontinuierlichen Puffer für seine String-Daten verwendet (was erlaubt ist): stackoverflow.com/a/1043318/1602642
3 Stimmen
@ChrisDesjardins: (1) Ihr Link ist veraltet (C++11 hat es zusammenhängend gemacht) und (2) selbst wenn es nicht so wäre,
std::getline(istream&, std::string&)
würde immer noch das Richtige tun.7 Stimmen
Anmerkung für alle, die sich diesen Code ansehen: Der Code, der als Beispiel für das Einlesen von char[] präsentiert wird, schließt das Array nicht mit Null ab (read tut dies nicht automatisch), was vielleicht nicht das ist, was Sie erwarten.
0 Stimmen
"die Antwort wäre sehr einfach". Verständlich ja, einfach nein ;-)
0 Stimmen
Gießen der
streampos
zurückgegeben vontellg()
in eineint
ist nicht garantiert, dass die Länge der Datei zurückgegeben wird. Wenn Sie diestreampos
am Anfang der Datei von dem am Ende der Datei unterscheidet, erhalten Sie einestreamoff
der garantiert von einem ganzzahligen Typ ist und einen Offset in der Datei darstellt, zumindest in C++11. Siehe cplusplus.com/referenz/ios/streamoff und der Kommentar in stackoverflow.com/a/10135341/1908650 . Siehe stackoverflow.com/a/2409527/1908650 für eine sichere Version.0 Stimmen
Warum ist diese Frage für Antworten geschlossen, da sie super veraltet ist und neue Antworten benötigt? Außerdem hat sie mehr als 650 Upvotes.
0 Stimmen
@AdanVivero Es wurde als Duplikat geschlossen. Neue Antworten sollten auf die verlinkte Frage gepostet werden.