[C++] An bestimmte Stelle in Datei schreiben

Hallo!
Ich hab folgendes Problem und brauche (mal wieder -.-°) Hilfe.
Es geht darum, eine Datei mit ofstream schreibend zu öffnen und an einer bestimmten Stelle Daten einzufügen. Die absolute Position, an der die Daten eingefügt werden sollen, ist mir bekannt. Lediglich die Daten ändern sich.
Nun möchte ich am liebsten zu der Adresse springen und die Daten einfach einfügen. Alternativ hätte ich ja nur die Möglichkeit, die ganzen Daten davor in einem Buffer auszulagern und die ganze Datei im Prinzip mit den neuen Daten neu zu schreiben. Das will ich aber nicht, da die Datei mehrere MB groß ist.
Hat jemand ne Idee, wie man das Problem lösen könnte?

Danke im Vorraus,
Extinction
 
Mit der Funktion seekp() deines ofstream Objekts. Da einfach als Parameter die Position eintragen und der nächste Output des Objekts geht direkt an diese Stelle.
 
Geht das so überhaupt?

Ich meine irgendwann mal gelesen zu haben dass man dazu die datei öffnen, bis zu der position einlesen und irgendwo hinschreiben, dann die daten anhängen und dann den rest der datei. sprich dass das garnicht so einfach geht...
 
Ich habe das mal mit seekp() getestet und es werden zwar Daten an diese Stelle geschrieben(allerdings musste ich fstream verwenden, da die Daten sonst angehangen oder die Date geleert wurde), aber nicht eingefügt. Stattdessen wurde der alte Inhalt der Datei an dieser Stelle überschrieben.
Daher würde ich auch vermuten, dass es nicht anders geht als über die umständliche Variante.
 
Ich hab das auch gedacht, aber seekp() scheint zu funktionieren. Jedenfalls Theoretisch.
Bei mir macht der Befehl allerdings Probleme: Er leert erstmal die ganze Datei und schreibt dann an meine Gewünschte Stelle die Daten. Wie bekomme ich das jetzt hin, dass der Befehl die anderen Daten nicht einfach löscht?
Aber zumindest die Position stimmt. ^^
 
Hi,

Leert sicher der Befehl deine Datei und nicht das öffnen an sich?
Wenn dem so is versuch ios::out | ios::app


mfg,
Xalon
 
Edit: Achso, ich dachte Xalons Beitrag wäre auf meinen bezogen, da ich extinctions Beitrag noch nicht gelesen hatte.
Nein:
Code:
#include <iostream>
#include <fstream>

using namespace std;

int main(int argc,char **argv) 
{
        fstream o("testfile",ios::out|ios::in);
        if(!o) {
                return 1;
        }
        o.seekp(4);
        o << "c";
        return 0;
}

Code:
$ - cat testfile
aaaaabbbbb
$ - ./write
$ - cat testfile
aaaacbbbbb

Die Datei wird zwar nicht geleert, es werden lediglich Daten überschrieben und nicht eingefügt. ios::app habe ich schon versucht, es führt jedoch lediglich dazu, dass die Daten immer angehangen werden und o.seekp() nicht mehr funktioniert(auch wenn man ios::beg als zweiten Parameter nimmt).
 
@Xalon
Hast recht, es war das Öffnen an sich.
Vorher hatte ich
ofstream out("Testdatei.dat",ios::out);
Das hat auch mit dem zusätzlichen Parameter | ios::app die Datei geleert.

Lesco's Variante funktioniert:
fstream out("Testdatei.dat",ios::in | ios::out);
Topic solved! thx :)
 
Original von Extinction

Lesco's Variante funktioniert:
fstream out("Testdatei.dat",ios::in | ios::out);
Topic solved! thx :)

Ich dachte, du wolltest Daten einfügen und nicht an dieser Stelle die Daten überschreiben.(Das macht nämlich meine Variante)
Wenn es dir wirklich um's Einfügen geht, bleibt dir wahrscheinlich nichts anderes übrig, als die Daten irgendwo zwischenzuspeichern und wieder in die Datei zu schreiben.
 
Zurück
Oben