[Solved] (o)fstream löscht immer die Datei
-
Recht einfache Frage, aber ich konnte es nicht finden...
Wie verhindere ich, dass ich, wenn ich mit einem (o)fstream in eine Datei schreibe (modes out und binary, ich schreibe mit (o)fstream.write), diese bis auf meine neuen Einträge komplett geleert wird und der Übersprungene Teil mit 0-Bytes aufgefüllt wird?
Ich benutze nebenbei Linux und das Programm muss auf Windows laufen, ob es auf Linux läuft ist nur zum Testen interessant.
-
-
cooky451 schrieb:
http://www.cplusplus.com/reference/iostream/ofstream/ofstream/
ios_base::app-> std::ios::app übergeben.
-
lol, erst stand da nur der Link... (beim Kopieren nicht gemerkt)

-
Das Problem mit ios::app ist allerdings, dass er dann, egal wie ich vorher seekp benutze, immer ans ende anhängt.
Ich möchte aber auch Daten mittendrin ändern.Aber danke für den Vorschlag

-
zur not lies dir deine datei komplett ein und hantier dann in deiner datenstruktur rum und gib die am ende wieder komplett aus...
-
Das würde bedeuten, dass ich eine mehrere Gigabyte große Datei in den Arbeitsspeicher laden muss... Ich glaube nicht, dass das so gut ist.
Und alles in eine andere Datei kopieren... das alles kommt mir nicht sehr eleganz vor.
Sonst muss ich wohl fwrite nehmen...
-
Xandaros schrieb:
Sonst muss ich wohl fwrite nehmen...
Hä? Und was kann fwrite jetzt was die Filestreams nicht können?
-
Xandaros schrieb:
Sonst muss ich wohl fwrite nehmen...
Narp. Was Du bei fwrite findest, wirste auch bei ofstream finden.
-
Davon bin ich überzeugt, aber ich muss bis morgen eine Lauffähige Version haben, oder mein Teammitglied erschlägt mich

(Schulprojekt)Ein filestream wird unserem Lehrer allerdings sicherlich besser Gefallen...
-
Mein Gott.. wenn du einfach mal posten würdest, wie du das mit fwrite machst, dann sagen wir dir wie du das mit ofstream machen kannst. War das denn so schwer zu verstehen?
-
fseek(file,512);
fwrite(daten,größe,1,file);Einfach Daten in der Datei an einer bestimmten Stelle überschreiben.
-
-
Ich liebe es, wenn Informationen mit fortlaufenden posts verloren gehen

Naja, passiert mir auch manchmal.Ich benutze ja schon lange seekp, aber der Teil vor der Stelle an die ich schreibe wird mit 0-Bytes aufgefüllt und der Teil dahinter abgeschnitten.
Und das möchte ich verhindern.
Oder ist das eine Eigenart meiner Maschiene?
-
Aha! Schreib das doch im Eingangspost.

Nimm fstream.
-
Xandaros schrieb:
Oder ist das eine Eigenart meiner Maschiene?
Wenn du es richtig machst, dann passiert das nicht. Wenn doch, ist was kaputt. Was ich aber nicht glaube.
fstream foo("test.dat", ios::in | ios::out); foo.seekp(3, ios::beg); foo << "Hallo";$> echo "ABCDEFGHIJKL" > test.dat; ./a.out; cat test.dat ABCHalloIJKL
-
SeppJ schrieb:
Xandaros schrieb:
Oder ist das eine Eigenart meiner Maschiene?
Wenn du es richtig machst, dann passiert das nicht. Wenn doch, ist was kaputt. Was ich aber nicht glaube.
Er hat bisher wohl ofstream genutzt. (Und der Standardkonstruktor scheint sich genau wie beschrieben zu verhalten.)
-
Hmm, auf die Idee die Datei lesend zu öffnen, bin ich gar nicht gekommen...
(Schließlich möchte ich ja eigentlich nur schreiben)Danke!
-
Xandaros schrieb:
Hmm, auf die Idee die Datei lesend zu öffnen, bin ich gar nicht gekommen...
(Schließlich möchte ich ja eigentlich nur schreiben)Nun, das ist im Prinzip nur eine clevere Benutzung der zur Verfügung stehenden Flags. Das kann manchmal etwas verwirrend sein. Falls du mit den Flags bei den C-Dateien sicherer umgehen kannst (anscheinend ist das ja so, da du mit fwrite keine Probleme hattest), ist in Tabelle 95 im Standard (C++98) eine Übersetzung zu finden. Der Modus "r+" den du hier möchtest (anders würde das in C auch nicht gehen) entspricht gerade in und out.