C++ an den Anfang einer Datei schreiben (ohne den Inhalt zu löschen)

kiep schmeiling

Cadet 4th Year
Registriert
Jan. 2009
Beiträge
64
Hi,
ich hab ein kleines Problem beim schreiben in eine Datei:
und zwar will ich einen Text am Anfang der Datei, also vor dem Ursprungstext, einfügen.
Soweit ich weiß erledigt man das am besten über die Öffnunsmethode mit ios::xxx.
Soweit so gut, alle Öffnungsmethoden mal durchprobiert, aber bei alle löscht er den Inhalt der Datei beim Öffnen (außer bei ios::app, aber das setzt den Positionszeiger vor jedem Schreibvorgang neu ans Ende der Datei. Kann man das irgendwie unterbinden?).
Also habe ich mich mal im Internet umgeschaut und habe gelesen, dass man mehre methoden verknüpfen muss, damit auch ohne ios::app der Inhalt beim Öffnen nicht gelöscht wird (mit ios::in | ios::out | ios::ate soll das funktionieren, da leer er die Datei aber trotzdem), also hab ich alle erdenklichen Möglichkeiten ausprobiert, aber immer leert er die Datei beim Öffnen (esseidenn ich verwende NUR ios::in, dann kann ich aber nicht schreiben, oder eben ios::app, dann kann ich nur ans Ende schreiben.
Wie kann ich nun eine Datei zum schreiben öffnen, und dabei an beliebige Stellen schreiben?
Es ist mir auch egal wo der Positionszeiger am Anfang steht, den kann ich ja manuell versetzen, er darf sich nur nicht immer wieder automatisch zurücksetzen.


Edit: Ah, kann ich das Codefenster irgendwie verkleinern, sonst muss man ja zum Lesen immer seitlich scrollen?
Und sorry für den Smily, der ersetz mein <doppelpunkt>o immer durch den Smily, ich weiß nicht wie das weggeht...


Hier nach der Code der ist, falls das relevant ist, geschrieben und compiliert mit Dev-C++.

Code:
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <strings.h>
#include <fstream>


using namespace std;


int main(int nNumberofArgs, char* pszArgs[])
{
string buf;
char line[2000];
string sline;

char filename[500];

if(nNumberofArgs<=1){cout<<"In welche Datei soll geschrieben werden?\n";cin.getline(filename, 500);pszArgs[1]=filename;}

cout<<"Oeffne Datei <"<<pszArgs[1]<<">...\n\n\n"<<endl;

ofstream file(pszArgs[1], /*was muss hier hin?*/); //ich kann statt ofstream auch nur fstream verwenden oder?
  
if (!file.good()){cerr<<"\nKonnte Datei <"<<pszArgs[1]<<"> nicht oeffnen!"<<endl;goto ende;}//fehler ausgeben wenn datei nicht geöffnet werden konnte

   
file.seekg( 0, ios_base::beg ); //positionszeiger an den Anfang der Datei setzen


cout<<"gib jetzt den Text ein, der in der Datei gespeichert werden soll. (xx zum beenden)\n\n\n"<<endl;
for (;;)
{
cin.getline(line, 2000);
sline = line;
if (sline == "xx"){file.close(); break;}   //das nur weil ich kein const char mit char array vergleichen kann
file << line <<endl;
if (!file.good()){cerr<<"\nFehler beim Schreiben in die Datei <"<<pszArgs[1]<<">"<<endl;goto ende;}  //ja ich weiß ich könnte auch break benutzen...
}

cout<<"\nerfolgreich beendet\n";
  
  
ende:;
  
  system("PAUSE");
  return 0; 
}
 
Zuletzt bearbeitet:
Wie wärs mit öffenen und mit .write in den RAM kopieren und da modifizieren und dann wieder zurückschreiben?

bei ofstream file(...);
mach lieber bloß ofstream file; und dann file.open(...);

Also öffnen mit ios_base::in löscht nichts und man kann schreiben.
Allerdings überschreibt er alle Buchstaben wie wenn man in Word den Korrigiermodus an hat.

Also:

Testtext

wird beim Einfügen von D am Anfang zu

Desttext
 
Zuletzt bearbeitet:
Das mit dem in den RAM kopieren wird denk ich nicht gehen, da ich auch in Dateien schreiben möchte, die keine Textdateine sind (z.B. Musik), wenn du das dann z.B. mit dem normalen Notepad öffnest, Text einfügst und speicherst ist das Lied nicht mehr abspielbar, und ich denke, dass es mit dem in den RAM kopieren genauso ausgehen wird (wenn ich die Musik -Dateien mit nem anderem C++ programm anzeigen lasse, kommt nur Murks raus, also kann der das auch nicht lesen, ist ja auch logisch). Ist aber an sich eigentlich ne gute Idee, danke dafür. Hab ich halt vergessen zu erwähnen.

Daher wird das mit ios_base::in leider auch nicht funktionieren.

Danke für den Tipp mit dem getrennt öffnen, werd ich tun, aber aus reiner Neugirde (bin ja am lernen) Wieso? Also wo ist da der Unterschied, ich kannte nämlich bisher nur meine Methode.
 
Daten im PC liegen so oder so nur binär vor, also 1 und 0. Ganz egal ob im RAM oder in einer Datei. Das was du im letzten Posting beschreibst, ist eher ein Anwenderfehler.

Ansonsten zu deinem Problem:
kannst auch einfach eine neue Datei schreiben und die alte Datei hinten dranhängen, danach umbenennen. Damit erzielst du den gleichen Effekt des vorne einfügens.
 
Das mit ios_base::in funktioniert schon, und du kannst auch noch ios_base::bin dranhängen, dan hasste alles im Binärformat.
Das dein mp3 nicht mehr abspielbar ist hängt einmal mit Notepad und einmal mit der mp3 zusammen.
Notepad kann nicht alle "Zeichen", daher wird beim Abspeichern jedes unbekannte Zeichen durch ein immer gleiches Zeichen ersetzt. Dadurch ist die Datei definitiv kaputt.
Auch ist bei vielen Formaten der Header fest vorgegeben, eine Änderung und die Datei ist kaputt.
 
bei den funktionen mit denen du die datei öffnest gibt es sicher einen bit der den zeiger auf anfang der datei setzt und darauffolgende bits nicht überschreibt. muss du halt gucken.
 
Zurück
Oben