Ich bin auf der Suche nach einer Klärung, wie seekg()
und seekp()
in Bezug auf arbeitet, wenn Sie in eine Datei schreiben. Sagen Sie zum Beispiel habe ich eine Datei in etwa so:fstream seekg(), seekp() und write()
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
Jetzt mag ich die Datei öffnen und einige suchen Werte lesen und zu schreiben.
fstream file;
file.open("file.txt", fstream::in |fstream::out | fstream::binary);
file.seekp(0, ios::end) // seek to the end of the file
int eofOffset = file.tellp(); // store the offset of the end-of-file, in this case 20
int key = 0;
file.seekg(12, ios::beg); // set the seek cursor to offset 12 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 8
file.seekg(8, ios::beg); // set the seek cursor to offset 8 from the beginning of the file
file.read((char *) &key, (int)sizeof(int)); // read in the next 4 bytes and assign it to key, in this case 6
Jetzt möchte ich an das Ende der Datei schreiben. Da die seekg()
Funktion nur den Suchcursor bewegt, sollte mein seekp()
Cursor immer noch am Ende der Datei rechts sein? Also:
int newKey = 12;
file.write((char *) &newKey, sizeof(int));
sollte meine Datei machen nun wie folgt aussehen:
offset 0: 2
offset 4: 4
offset 8: 6
offset 12: 8
offset 16: 10
offset 20: 12
Nun, was zu meiner Datei passiert, wenn ich auf einen Versatz suchen, auswählen und seinen Wert schreiben, wie die auf den Offset-Wert, der war gerade eingefügt. Zum Beispiel möchte ich offset 8
eofOffset = 20
halten, da wir gerade 12 bei diesem Offset eingefügt haben.
Wenn ich tun:
file.seekp(8, ios::beg);
file.write((char *) &eofOffset, sizeof(int));
macht es umschreiben richtig meine Datei wie folgt aussehen:
offset 0: 2
offset 4: 4
offset 8: 20
offset 12: 8
offset 16: 10
offset 20: 12
Bitte lassen Sie mich wissen, wenn ich Fehler mache die seekg()
und seekp()
Funktionen.
Danke! Wann würden Sie also den Puffer spülen? Würden Sie es nach jedem Lesen und Schreiben leeren, oder wäre es in Ordnung, es zu verlassen, wie es ist, wenn Sie eine Reihe von Lesevorgängen oder eine Reihe von Schreibvorgängen machen? – raphnguyen
@raphnguyen Spülen des Puffers ist eine relativ teure Operation, es gibt normalerweise keine Notwendigkeit, manuell zu spülen, es sei denn, Sie wechseln vom Schreiben zum Lesen und Sie suchen nicht, es sei denn, Sie haben einen guten Grund zu spülen lassen die Implementierung mit anderen Spülung. – user657267