2017-02-13 6 views
0

Ich habe eine Situation, wo ich die ersten 64 Zeilen einer Datei durchlaufen und speichern Sie jede Zeile in einer Zeichenfolge. Der Rest der Datei ist unbekannt. Es kann eine einzelne Zeile oder viele sein. Ich weiß, dass es 64 Zeilen am Anfang der Datei geben wird, aber ich weiß ihre Größe nicht.Speichern von Datei Daten von der aktuellen Position bis zum Ende der Datei mit fstream

Wie kann ich den gesamten Rest der Datei in einer Zeichenfolge speichern?

Dies ist, was ich derzeit haben:

std::ifstream signatureFile(fileName); 

for (int i = 0; i < 64; ++i) { 
    std::string tempString; 
    //read the line 
    signatureFile >> tempString; 
    //do other processing of string 
} 
std::string restOfFile; 
//save the rest of the file into restOfFile 

Dank der Antworten das ist, wie ich es bekam Arbeit:

std::ifstream signatureFile(fileName); 

for (int i = 0; i < 64; ++i) { 
    std::string tempString; 
    //read the line 
    //using getline prevents extra line break when reading the rest of file 
    std::getline(signatureFile, tempString); 
    //do other processing of string 
} 

//save the rest of the file into restOfFile 
std::string restOfFile{ std::istreambuf_iterator<char>{signatureFile}, 
     std::istreambuf_iterator<char>{} }; 
signatureFile.close(); 
+1

Der Rest der Datei kann größer als die RAM-Größe sein, sogar eine Zeichenfolge kann diese Größe überschreiten. Um also eine unbekannte Menge an Daten zu lesen, lesen Sie + gcount – user5821508

+3

Sie lesen nicht * Zeilen *, Sie lesen * Wörter *. Werfen Sie einen Blick auf ['std :: getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline). –

+0

Danke !! Das hat mich gerettet. Ich bekam eine zusätzliche Zeile, wenn ich Sams Methode benutzte. Getline hat das Problem behoben. – Tommizzy

Antwort

4

Einer std::string ‚s Konstrukteuren eine Vorlage, die zwei Iteratoren nimmt als Parameter einen Iterator für Anfang und Ende und konstruiert eine Zeichenfolge aus der von den Iteratoren definierten Sequenz.

Es passiert einfach so, dass std::istreambuf_iterator einen geeigneten InputIterator liefert über den Inhalt eines Eingangsstroms für Iterieren:

std::string restOfFile{std::istreambuf_iterator<char>{signatureFile}, 
     std::istreambuf_iterator<char>{}}; 
+0

Ich bin ein wenig verwirrt, wie istrreambuf_iterators arbeiten. Wie kann ich die aktuelle Position nach der for-Schleife erhalten und auf einen Iterator setzen? – Tommizzy

+0

Sie nicht. Der Iterator erledigt das für Sie. Sie übergeben das Dateistream-Objekt einfach an den Iteratorkonstruktor und es wird von der aktuellen Position ausgehend iteriert. Genau wie im Beispiel, das ich in meiner Antwort gezeigt habe. –

+0

Interessant, ich werde es versuchen. Das zweite Argument bedeutet also, dass es weiterhin in den String schreiben wird, bis es das Ende der Datei erreicht. – Tommizzy

0

Sie String-Puffer verwenden können.

#include <sstream> 

// ... 

stringbuf buf; 
signatureFile.get(buf); 
string restOfFile = buf.str(); 
Verwandte Themen