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++
Antwort
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.
Das klingt gut, aber was ist der Code dafür? Nehmen wir an, dass die Zeichenfolge die gleiche Länge hat. – neuromancer
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. –
fseek funktioniert nicht mit ofstream. Wie kann es mit Ofstream gemacht werden? – neuromancer
Ö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.
Ich möchte es auf diese Weise vermeiden. – neuromancer
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);
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
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
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
- 1. OpenCSV liest nur einen Teil einer Datei
- 2. Teil einer großen Datei in Python überschreiben
- 3. Nur einen bestimmten Teil einer Datei ändern
- 4. Update nur Teil einer Binärdatei mit C++
- 5. Wie verwenden Sie einen DeflateStream für einen Teil einer Datei?
- 6. Wie ersetzen Sie einen Teil einer Trennlinie in einer Datei?
- 7. Erledige einen Teil einer Datei in Python
- 8. Überschreiben einer vorhandenen Datei in C#
- 9. Lies nur einen Teil einer Datei von der Festplatte in objective-c
- 10. C++ sucht einen Teil einer Datei zu ignorieren?
- 11. Überschreiben einer Datei in Python
- 12. Wie liest man einen Teil einer Datei und speichert sie?
- 13. Wie kann ich nur einen Teil einer Seite herunterladen?
- 14. Iterate durch nur einen Teil einer großen Liste in Java
- 15. einen bestimmten Teil einer Textdatei in C Lesen ++
- 16. nur den aktualisierten Teil einer CSV-Datei in Python Lesen
- 17. Pycharm: nur einen Teil meiner Python-Datei ausführen
- 18. Wie in C# nur Zeit Teil eines Datetime-Variable setzen
- 19. Wie ziele ich auf einen bestimmten Teil einer Zeichenfolge C#
- 20. Ändern nur einen Teil der Objekteigenschaften
- 21. Drucken Teil einer TXT-Datei
- 22. Nur ein Teil der JSON-Datei angezeigt
- 23. xjc nur für einen Teil des Schemas
- 24. Entfernen doppelte Zeilen (nur erster Teil) aus einer Datei
- 25. Nur einen Teil eines XML-Feeds abrufen
- 26. einen Teil einer Zeichenfolge in mehreren Spalten
- 27. PHP: Ändern Sie nur einen Teil einer URL-Zeichenfolge?
- 28. Wie zeige ich nur einen Teil der Website in UiWebView?
- 29. Wie gruppiert man nur einen Teil eines Datensatzes in SSRS?
- 30. Das Copyright-Teil in einer Datei
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
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. –