2010-03-27 13 views
7

Ich möchte Änderungen an der Mitte einer Textdatei mit C++, ohne den Rest der Datei zu ändern. Wie kann ich das machen?Wie überschreiben nur einen Teil einer Datei in C++

+2

Dies ist kein Duplikat. Im vorherigen Post ging es nur darum, wie man einen Datensatz liest, es geht darum, in eine Datei zu schreiben. Sie müssen aufmerksamer lesen. – neuromancer

+1

Ihre Ausarbeitung, dass die Ersetzung die gleiche Länge hat, macht das Fleisch der Frage, wie Sie den Dateizeiger neu positionieren, was genau die Antworten auf Ihre andere Frage ist. –

Antwort

8

Wenn die Ersatzzeichenfolge dieselbe Länge hat, können Sie die Änderung vornehmen. Wenn der Ersetzungsstring kürzer ist, können Sie ihn möglicherweise mit Leerzeichen der Breite null oder ähnlichem auffüllen, um die gleiche Anzahl an Bytes zu erhalten, und die Änderung an Ort und Stelle vornehmen. Wenn die Ersatzzeichenfolge länger ist, reicht der Platz nicht aus, es sei denn, Sie verschieben zunächst alle verbleibenden Daten.

+0

Das klingt gut, aber was ist der Code dafür? Nehmen wir an, dass die Zeichenfolge die gleiche Länge hat. – neuromancer

+3

Nun, es hängt davon ab, welche E/A-Bibliothek Sie verwenden, die C-Standardbibliothek, C++ - Standardbibliothek oder eine betriebssystemspezifische API. Aber im Allgemeinen gibt es drei Schritte. Geben Sie beim Öffnen der Datei Schreibzugriff ohne Kürzung an, z. fopen (fname, "r +"). Suchen Sie den gewünschten Ort mit z. fseek. Schreiben Sie die neue Zeichenfolge mit z.B. fwrite oder fprintf. In einigen APIs wie Windows OVERLAPPED oder Linux AIO können Sie "Schreibe an diesen Speicherort" ohne einen separaten Suchschritt sagen. –

+0

fseek funktioniert nicht mit ofstream. Wie kann es mit Ofstream gemacht werden? – neuromancer

0

Öffnen Sie im Allgemeinen die Datei zum Lesen im Textmodus, lesen Sie Zeile für Zeile bis zur Stelle, die Sie ändern möchten, während Sie die Zeilen lesen, schreiben Sie sie in eine zweite Textdatei, die Sie zum Schreiben geöffnet haben. Schreiben Sie an der Stelle, an der Änderungen vorgenommen werden sollen, die neuen Daten in die zweite Datei. Fahren Sie dann mit dem Lesen/Schreiben der Datei bis zum Ende fort.

+1

Ich möchte es auf diese Weise vermeiden. – neuromancer

12

Verwenden Sie Std :: Fstream.

Der einfachere std :: ofstream würde nicht funktionieren. Es würde Ihre Datei abschneiden (es sei denn, Sie verwenden die Option std :: ios_base :: app, was sowieso nicht gewünscht ist).

std::fstream s(my_file_path); // use option std::ios_base::binary if necessary 
s.seekp(position_of_data_to_overwrite, std::ios_base::beg); 
s.write(my_data, size_of_data_to_overwrite); 
+0

Wenn Sie das Flag "std :: ios_base :: binary" verwenden, vergessen Sie nicht, dass Sie dies oder das mit "std :: ios_base :: out" tun müssen – qbert220

+0

Verwenden Sie 'std :: ios_base :: binary | std :: ios_base :: out'-Modus-Flags bewirken eine Kürzung nach den Daten, die in die Datei geschrieben wurden. Mit 'std :: ios_base :: binary | std :: ios_base :: out | std :: ios_base :: in' verhindert dies. – qbert220

+0

Also, muss ich ** die Datei zum Lesen und Schreiben öffnen, um einen Teil der Datei zu ändern, auch wenn ich sie eigentlich nie * gelesen habe? Ist es möglich, ** nur ** Schreibzugriff zu ändern (nicht anzufügen), ohne alles zu überschreiben? Vielleicht erfordert fseek selbst, dass die Datei zum Lesen geöffnet ist, auch wenn fread nicht verwendet wird? (Obwohl mir das merkwürdig vorkommt) Schließlich, ist das eine OS-Einschränkung oder wie funktioniert die Standard-C++ - Bibliothek? – Dexter

Verwandte Themen