Text in einer txt Datei löschen

Tetsuya

Mitglied
Hallo
Hat einer ne Idee wie ich Textzeilen aus einer txt Datei nach einem Ereigniss in meinem VC++ Programm löschen kann
Ich google mich schon durch Internet find aber nicht.
Die MSDN Hilfe kann ich nicht aufrufen ich kann das CDLaufwerk nicht mehr ansprechen mainboard kaputt.
fände also nett wenn mir einer Helfen könnte.

mfg Tetsuya
 
Das geht nur indirekt.
Also Datei zum lesen öffnen, andere, neue Datei zum Schreiben öffnen.
Text lesen (teilweise oder komplett), ungewünschten Text im Speicher zappen
bearbeiteten Text in andere Datei schreiben
Wenn alles durch ist, beide Dateien schliessen, neue Datei über alte kopieren (bzw. Umbennen mit Überschreiben).
 
Geht das nicht noch einfacher die Textdatei kann auch mal gut ein paar Hundert Zeilen haben.
wie kann ich den nen Text im speicher löschen geht das mit einer delet anweisung?
Oder bin ich da uf dem Holzweg
und wie kann man Dateien über alte kopieren (Quellkode wäre net)

mfg Tetsuya
 
Mir fällt auch nur folgendes ein:
Code:
  CFile FileToChange;
  char * pBuffer;
  long lStart, lEnd, lDelSize, lFileSize, lNewSize;
  
  FileToChange.Open("Textfile.txt", CFile::modeReadWrite | CFile::shareExclusive);
  lFileSize = FileToChange.GetLength();
  lStart = GetStartDelPosition(...);	// hier die Position des ersten zu löschenden Zeichens ermitteln
 lEnd = GetEndDelPosition(...);		// hier die Position des letzten zu löschenden Zeichens ermitteln
  iDelSize = lEnd - lStart + 1;		// Größe des zu löschenden Blockes
  lNewSize = lFileSize - lDelSize;
  pBuffer = (char*)malloc(lNewSize);
 FileToChange.Read(pBuffer, lStart);						// 1. Teil in Buffer kopieren
 FileToChange.Seek(lEnd + 1, CFile::begin);				// Zum Anfang des 2. Teils gehen
  FileToChange.Read(pBuffer + lStart, lFileSize - lEnd);	// 2. Teil in Buffer kopieren
 FileToChange.SeekToBegin();								// Zum Dateianfang springen
 FileToChange.Write(pBuffer, lNewSize);					// Buffer-Inhalt in Datei schreiben
 FileToChange.SetLength(lNewSize);						// Neue Dateilänge setzen
 FileToChange.Close();									// Datei schließen
  free pBuffer;
Vielleicht hilft Dir das ja.
Grüße, jokey2
 
Danke das sieht gut aus ich hab nur noch ne kleine Frage
kann ich bei
lStart = GetStartDelPosition(...); // hier die Position des ersten zu löschenden Zeichens ermitteln
lEnd = GetEndDelPosition(...); // hier die Position des letzten
für die Positionen auch die Adressen aus einem Zeigerdatenfeld, welche auf den ersten und letzten zu löschenden string zeigen

mfg Tetsuya
 
Stehen in diesem Zeigerdatenfeld alle Zeilen der Datei (bzw. Zeiger darauf), die Du vorher komplett ausgelesen hast? Wenn nicht, was steht darin? Du kannst nicht direkt die Zeiger auf irgendwelche Strings als Dateipositionen angeben. lStart und lEnd sollen Dateipositionen sein, wie man sie z.B. auch mit Seek(...) bekommt.
 
Was ist seek ich kenne den Befehl nicht.
In dem Zeigerdatenfeld ist die Adresse des Anfangsstring und des Endestring von jedem Datenfeld in der txt Datei gespeichert. Von dem dann auch eventuell eines gelöscht werden muss (bzw ersetzt durch eines mit unbekannter neuer Länge)
 
CFile::Seek(pos, origin) positioniert den Dateizeiger auf eine gewünschte Stelle in der Datei. Die Syntax ist wie in den Code, den ich vorhin gepostet habe. 'pos' ist die neue Position des Dateizeigers relativ zu 'origin'. 'origin' ist CFile::begin, CFile::current oder CFile::end, was bedeutet Dateianfang, Aktuelle Position und Dateiende. Die Position des Dateizeigers wird gezählt in Anzahl der Bytes vom Beginn der Datei zu dem Zeichen, das als nächstes gelesen wird. Der Rückgabewert ist die neue Position des Dateizeigers. Seek(0, CFile::current) gibt also die aktuelle Position zurück, ohne sie zu verändern.
Wenn in dem Zeigerdatenfeld die Positionen des Dateizeigers gespeichert sind, dann sind lStart = 'Adresse des Anfangsstrings' und lEnd = 'Adresse des Endestring' + 'Länge des Endestring' (Ich gehe davon aus, daß 'Adresse des Endestring' auf den Anfang der letzten zu löschenden Zeile zeigt).
Grüße, jokey2
 
Zuletzt bearbeitet:
Hi
Danke an alle es funktioniert.:)
Ein Problem hab ich jetzt schon mal weniger.
Doch das mit dem Seek werd ich mir wenn ich Zeit hab nochmal genauer ansehen.

gruß Tetsuya
 
Zurück