2015-06-04 21 views
7

Ich denke, das sollte ziemlich einfach sein, aber mein googling hat bisher nicht geholfen ... Ich muss in eine vorhandene Datei in C++ schreiben, aber nicht unbedingt am Ende der Datei.Wie schreibe ich in die Mitte einer Datei in C++?

Ich weiß, dass, wenn ich will nur Text zu meiner Datei anhängen, ich die Fahne ios:app passieren kann, wenn open auf meinem Stream-Objekt aufrufen. Allerdings schreibe ich nur bis zum Ende der Datei, aber nicht in die Mitte.

machte ich ein kurzes Programm, das Problem zu veranschaulichen:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() { 

    string path = "../test.csv"; 

    fstream file; 
    file.open(path); // ios::in and ios::out by default 

    const int rows = 100; 
    for (int i = 0; i < rows; i++) { 
    file << i << "\n"; 
    } 

    string line; 
    while (getline(file, line)) { 
    cout << "line: " << line << endl; // here I would like to append more text to certain rows 
    } 


    file.close(); 

} 
+0

Sie können eine indizierte Datei-Bibliothek (wie [GDBM] (http://www.gnu.org.ua/software/gdbm/)) oder [SQLite] (http://sqlite.org/) verwenden möchten, oder sogar eine vollwertige Datenbank ([PostgreSQL] (http://postgresql.org/), [MongoDB] (http://mongodb.org/) ....) –

+0

Standard-Weg zum Ändern von Dateien: Eingabe lesen Datei, Prozess, Schreiben in neue Ausgabedatei, überschreibt, wenn erfolgreich, Eingabedatei mit Ausgabedatei. Es gibt "schnellere" Alternativen (wie ios :: app), aber sie sind nicht für jede Situation geeignet. – stefaanv

+5

Wurde das hier nicht schon millionenfach gefragt? –

Antwort

11

Sie nicht in der Mitte der Datei einfügen. Sie müssen die alte Datei in eine neue Datei kopieren und beim Kopieren in die neue Datei in der Mitte einfügen, was Sie wollen. Wenn Sie beabsichtigen, Daten/Zeilen in der vorhandenen Datei zu überschreiben, ist dies unter Verwendung von std::ostream::seekp() möglich, um die Position innerhalb der Datei zu identifizieren.

+5

nur auf Vollständigkeit : Sie können nicht in die Mitte einer Datei _insert_, aber Sie können _replace_, die gleiche Anzahl von Bytes, durch Überschreiben. –

+0

um weiter zu vervollständigen, siehe Beispielcode; http://stackoverflow.com/questions/2393345/how-to-append-text-to-a-text-file-in-c – Anil

+1

im Grunde können Sie den Dateizeiger überall mit der Funktion seekp() -Member bewegen und starten Schreiben. Alle Schreibvorgänge vor EOF ersetzen jedoch die alten Daten. – 911

Verwandte Themen