(C++) In Textdatei schreiben ohne Inhalt zu löschen

the_undertaker

Erfahrenes Mitglied
Hallo,

wenn ich mit fstream Daten in eine txt.-Datei schreibe, wird bei jedem Programmaufruf der bisherige Inhalt der Datei gelöscht. Wie kann man das verhindern?
 
Mit der Funktion fopen.
Syntax:
Code:
FILE * fopen ( const char * filename, const char * mode );

und sowohl fwrite.
Syntax:
Code:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );

Beispiel:
Code:
#include <stdio.h>

int main()
{
 FILE * myfile;
 char buffer[] = { 'x' , 'y' , 'z' };
 myfile = fopen( "meinedatei.txt" , "a+" );
 // a+ setzt den zeiger ans ende der datei...
 fwrite (buffer , sizeof(buffer[0]) , sizeof(buffer) , myfile );
 fclose(myfile);
 return 0;
}

Gruß Hallasas
 
Zuletzt bearbeitet:
Hallo,

man kann dem Konstruktor bzw. der open-Methode von fstream einen zweiten Parameter übergeben, der den Dateimodus bestimmt:
Code:
fstream filestr;
filestr.open("test.txt", ios::in | ios::out | ios::ate);
…
filestr.close();
ios::ate sorgt dafür, dass der Dateizeiger sofort nach dem Öffnen an das Ende der Datei gesetzt wird (at end). Alternativ kannst du auch von Hand den Zeiger an das Ende setzen:
Code:
fstream filestr;
filestr.open("test.txt", ios::in | ios::out);
filestr.seekg(0, ios::end);
...
filestr.close();

Grüße,
Matthias
 
Hallo,

man kann dem Konstruktor bzw. der open-Methode von fstream einen zweiten Parameter übergeben, der den Dateimodus bestimmt:
Code:
fstream filestr;
filestr.open("test.txt", ios::in | ios::out | ios::ate);
…
filestr.close();
ios::ate sorgt dafür, dass der Dateizeiger sofort nach dem Öffnen an das Ende der Datei gesetzt wird (at end). Alternativ kannst du auch von Hand den Zeiger an das Ende setzen:
Code:
fstream filestr;
filestr.open("test.txt", ios::in | ios::out);
filestr.seekg(0, ios::end);
...
filestr.close();
Grüße,
Matthias
Brauche ich dann noch fopen?
 
Zuletzt bearbeitet:
Eigentlich nicht.
Matthias hat dir die "fstream Methode" gezeigt, und ich dir die "file Methode".
Nun kannst du dich auf die dir am besten liegende Methode spezifizieren.

Gruß Hallasas
 
Leider funktioniert deine Methode nicht, Matthias, die ursprünglichen Daten werden trotzdem gelöscht:(

Gibt es für fopen auch noch eine andere Möglichkeit als fwrite? (Am besten wär es, wenn man das so handhaben könnte wie cout, das ist nämlich schön einfach;))

Hier mal meine Test-Fassung:
C++:
#include "stdafx.h"
#include <fstream>

using namespace std;

int main()
{
	fstream outfile;
	outfile.open("test.txt",ios::out|ios::ate);
	outfile<<"12345";
	outfile.close();
	return 0;
}
 
Zuletzt bearbeitet:
Hi.
Leider funktioniert deine Methode nicht, Matthias, die ursprünglichen Daten werden trotzdem gelöscht:(

Gibt es für fopen auch noch eine andere Möglichkeit als fwrite? (Am besten wär es, wenn man das so handhaben könnte wie cout, das ist nämlich schön einfach;))

Hier mal meine Test-Fassung:
C++:
#include "stdafx.h"
#include <fstream>

using namespace std;

int main()
{
	fstream outfile;
	outfile.open("test.txt",ios::out|ios::ate);
	outfile<<"12345";
	outfile.close();
	return 0;
}
Das sollte eigentlich genau so funktionieren. Welche Version von Visual Studio verwendest du denn?

Du kannst es ja einfach mit dem Alternativ-Vorschlag von Matthias versuchen.

Oder versuch erstmal den Modus "ios::in|ios::out|ios::ate". Das klingt zwar für einen ofstream unlogisch den Modus "in" zu verwenden, aber siehe http://msdn2.microsoft.com/de-de/library/8h8eh904(vs.80).aspx
Sie können ofstream-Objekte nicht mit dem ios::out-Flag allein öffnen. Das ios::out-Flag muss mit einem anderen ios-Enumerator in einem logischen OR-Befehl kombiniert werden, z. B. mit ios::in oder ios::app.

Gruß
 
Zuletzt bearbeitet:
Zurück