Brauche Experten-Hilfe für Datei-Bearbeitung
-
Folgende Situation:
Ich möchte eine große Datei laden (ca. 50MB ist keine Text Datei). Die Datei enthält ziemlich am Anfang auch sichtbaren Text (wenn ich die Datei in einem Editor öffne).
Nun möchte ich nur einen gewissen Text durch einen anderen ersetzen, der aber in der Größe unterschiedlich ist. Danach die geänderte Datei wieder speichern.
Es muß also die Datei nach einem gewissen Text (z.B. "Files\News") durchsucht werden und dann durch (z.B. "ProgramFile\Old") ersetzt werden. Durch die Größe, darf es aber auch nicht zu lange dauern.
Kann mir da jemand helfen ??Bitte Hilfe !!

-
Wenn du etwas ersetzen willst, mußt du sowieso die gesamte Datei neu schreiben (also auch lesen). Desweiteren solltest du das Format der Datei kennen, sonst geht das Ersetzen in die Hose.
-
tolle Antwort !!
wenn ich z.B. die Datei in 'UltraEdit-32' öffne, geht das auch relativ schnell und ich brauch dem Programm nicht zu erzählen was für ein Format meine Datei besitzt. Trotzdem kann ich dort suchen und ersetzen und dann wieder speichern. Also muß es doch einen Weg geben. Es ist auf jeden Fall keine Text Datei, sonst wäre es ja einfach. Deswegen suche ich ja Experten, die sich damit auskennen.
-
Tolle Aussage...
Für so etwas braucht man keine Experten, sondern muß die GRUNDLAGEN der C++-Programmierung beherschen. Dieses Forum ist nicht dazu gedacht, Dir diese Grundlagen zu vermitteln.
Lies Dich bei TFileStream mal ein bißchen ein. Wenn Du auf spezifische Probleme stößt, kannst Du ja nochmal fragen.
-
erstens habe ich erst angefangen mit c++ und zweitens dachte ich, daß so ein Forum dafür da ist jemanden wie mir auch zu helfen. Wenn alle alles wüßten, würde hier niemand schreiben oder ?
Wenn es so einfach ist, dann schreib doch bitte mal das Schema, wie dieses Problem zu lösen ist. Irgendwie habe ich den Eindruck, daß es niemand so richtig weiß.
TFileStream, fstream ... habe ich in diversen Büchern gelesen, aber die Beispiele sind immer nur auf Text Dateien bezogen, sodaß ich damit nichts anfangen kann bzw. die Versuche fehlschlagen. Wenn es eine Text Datei wäre hätte ich da kein Problem. TStringList, LoadFromFile, StringReplease, SaveToFile.
Naja, vielleicht gibt es ja doch jemand, der mir hilft und nicht nur darstellen will, wie toll er ist und schon alles weiß.
-
Öffne mit einen TFileStream-Objekt die Datei. Mit der Methode Read kannst du dann die Datei in ein char-Array einlesen und dort bearbeiten. Mit Write schreibst du dann den geänderten Inhalt zurück.
In welchen Modus die Datei geöffnet werden muß, dazu sieh dir bitte noch einmal die Hilfe an, ebenso zu den Methoden.Schema ok?

-
OldMan00 schrieb:
Naja, vielleicht gibt es ja doch jemand, der mir hilft und nicht nur darstellen will, wie toll er ist und schon alles weiß.
Darum geht es nicht. Hier soll, insbesondere bei Anfängern, Hilfe zur Selbsthilfe gegeben werden. Es nützt Dir gar nichts, wenn wir Dir den Code vorkauen. Dadurch lernst Du überhaupt nichts.
Burkhi schrieb:
Schema ok?

Yep.

-
Ich verrate dir mal ein kleines Geheimnis
Wenn du eine Datei mit "UltraEdit-32" (oder einem anderen Programm) öffnest, macht es auch nichts anderes als das hier beschriebene Verfahren - es sucht sich ein möglicherweise passendes Dateiformat aus, liest die komplette Datei in den Speicher, verschiebt im Speicher einzelne Bytes und schreibt sie wieder.(und Probleme kann es dann geben, wenn der Editor dein Dateiformat falsch errät - wenn die Größe deines Textbereiches z.B. konstant sein soll und du löschst da drin etwas, verschiebt sich die ganze Dateistruktur)
-
erstmal Danke an alle !!
Öffne mit einen TFileStream-Objekt die Datei. Mit der Methode Read kannst du dann die Datei in ein char-Array einlesen und dort bearbeiten. Mit Write schreibst du dann den geänderten Inhalt zurück.
In welchen Modus die Datei geöffnet werden muß, dazu sieh dir bitte noch einmal die Hilfe an, ebenso zu den Methoden.
Schema ok?ok. Mit einen TFileStream-Objekt hab ich es auch schon versucht. Mein Problem ist das char-Array. aber danke.
Darum geht es nicht. Hier soll, insbesondere bei Anfängern, Hilfe zur Selbsthilfe gegeben werden. Es nützt Dir gar nichts, wenn wir Dir den Code vorkauen. Dadurch lernst Du überhaupt nichts.
im Prinzip richtig, doch wenn ich 'hänge' und überhaupt keine Hinweise bekomme, nützt das auch nix und es wirkt nur arrogant. Wenn ich einmal eine Lösung gefunden habe bzw. gezeigt bekommen habe, ist es kein Problem dies auf andere Situationen umzusetzen und so dann zu lernen, aber wenn man vorm nichts steht, kann man nur lernen, wie sich andere darüber 'lustig' machen.
übrigens ist nach Bearbeitung die Größe der Datei nicht relevant, muß also nicht gleich groß sein und aufwendige Prozeduren von checksummen entfallen, es gibt kein check der Bytes.
Ich wäre trotzdem dankbar, wenn ich noch etwas nähres erfahren könnte. Die Sache mit dem char, hier c, ist mir einfach unklar.TFileStream* tfs=new TFileStream("c:\\t.dat",fmOpenReadWrite); char c=1; tfs->Seek(0,FILE_BEGIN); tfs->Read(&c,sizeof(c)); . . . delete tfs;
-
Das liegt wohl daran, dass das mit dem char falsch ist. Naja, nicht direkt falsch, aber hier unbrauchbar. Das seek brauchst du auch nicht (zumindest nicht am Anfang). Du musst einen Puffer (char*) erstellen und in den dann einlesen.
TFileStream* tfs=new TFileStream("c:\\t.dat",fmOpenReadWrite); const int SIZE = 1000; // nur ein Beispiel char* c = new char[SIZE]; tfs->Read(c, SIZE); . . . delete[] c; delete tfs;Dann hast du in c die ersten 1000 Bytes deiner Datei.
-
oh super, das hilft mir weiter !!
kann ich ja dann für 1000 tfs->Size einsetzen und hab die ganze Datei oder ?
Dann die Datei in 3 Teile teilen.
1. Anfang 0 - 57 (offset ist immer gleich und ist bei 57)
2. Länge des alten Textes (auch bekannt)
3. Rest -(1+2)Dann Anfang + neuen Text + Rest speichern.
Ist der Gedanke richtig ??Nochmals vielen Dank, sollten noch Probleme auftauchen melde ich mich noch mal.
-
Ah, da ich mit char Arrays noch nichts zu tun hatte folgendes Problem.
wie lese ich einen AnsiString, der in einer Variable steht, in ein Array. In den Büchern und der Online Hilfe nehmen die immer nur text in Anführungszeichen.char x[] = "test"; funktioniert AnsiString y = "test"; char x[] = y; funktioniert nicht !! char x[] = y.c_str(); auch nicht !!
-
Schau mal nach strncpy()
-

Hab dies gefunden, ist das auch ok ??
char* x = StrNew(y.c_str());aber sehe gerade später brauche ich
strncpy()danke
-
OK, soweit funktioniert jetzt alles !!

Hab zwar mit dem offset(seek) noch etwas zu probieren. Bleibt der Zeiger bei read oder write an dem letzten Zeichen stehen das gelesen bzw. geschrieben wurde und ich muß ihn mit seek um eins vorrücken ??
Ein Problem bleibt noch. Was ist, wenn die Lägen der Daten dann kürzer oder länger sind ? Kann ich die mit TFileStream geöffnete Datei in der Göße ändern oder muß ich eine neue Datei/Stream/ oder MemoryStream erstellen ?
-
Du solltest eine neue Datei schreiben.
-
ES FUNKTIONIET !! So wie ich mir es vorgestellt habe !
super ! hast mir wirklich sehr geholfen. Und ich habe auch dabei gelernt.
Habe nun ein Beispiel, wo ich jederzeit darauf zurückgreifen kann. 
schönen Gruß an Dresden ! Ich bin in Plauen geboren.Also dann danke nochmal
