In Datei löschen?
-
Hey EveryOne
Folgender Code:
// Versuche, Datei zu öffnen for(int i = 0; i < 3 && (fpMain = fopen((*this).get_strFileName(1), "a+")) == NULL; i++) { sleep(5); } // Zähle die Zeilen der Datei strcpy(strFileBuf, ""); while(fpMain != NULL && fgets(strFileBuf, sizeof(strFileBuf) / sizeof(char), fpMain) != NULL) { iLineCount++; } // Wenn zu viele Zeilen (z.B. maximal 96), lösche die ersten paar for(int i = 0; i <= m_iLineLimit - iLineCount; i++) { // Lösche so viele Zeilen am Dateianfang wie nötig }Die Idee wäre jetzt nun, falls sich in der Textdatei bereits zu viele Zeilen befinden, diese zu löschen. Nun, wie mache ich das am Besten? Muss ich dazu die Datei erst in einen String einlesen, diesen von Hand editieren und dann wieder ausgeben oder geht das auch ein wenig eleganter
?Danke für jede Antwort und Gruss
Kessi
-
Das ist nicht C++.
-
... schrieb:
Das ist nicht C++.
Huh? Uhm, naja, es ist zumindest der Code, den ich in einer Funktion meiner C++ Klasse verwende. Bei allem Weiteren bin ich nicht so zimperlich
.In jedem Fall thx 4 the Info, allerdings trägt selbige nur sehr wenig zur Lösung meines ursprünglichen Problems bei: dem Löschen von Text bzw. ganzen Zeilen in einer Datei...
greeetz
Kessi
-
Physisch kannst du deine Dateien (oder Teile davon) nur löschen, indem du sie mit neuem Inhalt überschreibst. Ich weiß nicht, ob es in der WinAPI oder im Linux-System Funktionen gibt, um eine Datei zu kürzen, aber auf C++ Ebene bleibt dir nur die Möglichkeit:
- gesamte Datei einlesen
- Dateiinhalt im RAM verarbeiten
- Datei im Modus
ios::outbzw. "w" öffnen und neuen Inhalt zurückschreiben
(die Datei-Operationen würde ich sowieso auf ein Minimum beschränken - bei Programmanfang den kompletten Dateiinhalt einlesen (wenn nötig) und am Ende alles wieder zurückschreiben)
PS: In einer C++ Umgebung solltest du lieber IO-Streams verwenden anstelle der FILE*-Funktionen.
-
ich geh das ganze mal rein theoretisch an und benutz dabei mal streams (zeilenerkennung kannst da sicher selber noch einbaun)
man hole sich einen filestream, merke sich die schreibposition = 0, seeke 20% nach vorn vom anfang, merke sich die seekposition, kopiere sich von seek an einen block kleiner als differenz von schreib und seek position, schreibe ihn an die schreibposition, rücke seek um die geschriebenen byte nach vorn und wiederhole das bis seek das ende erreicht, anschliessend setEOF() an die finale schreibposition um die datei abzuschneiden, fertig
das schreiben überlass ich dir
mfg
EDIT: stoll war schneller, wenn die datei nicht zu groß ist gehts auch so :p
-
Hmm... Ok, also doch von Hand. Da die Funktion dazu da ist, die Datei nicht zu gross werden zu lassen, werde ich mich vermutlich für die alles einlesen / editieren / alles ausgeben - Variante entscheiden.
Danke also erst mal und bis nächstens

Greeetz Kessi
-
DAS IST KEIN c++
:p

-
CStoll schrieb:
PS: In einer C++ Umgebung solltest du lieber IO-Streams verwenden anstelle der FILE*-Funktionen.
Einspruch. Die C-Funktionen sind bei allen gängigen Compilern wesentlich performanter; wenn das eine Rolle spielt, sind sie (evtl. auch die OS-eigenen APIs) fstreams vorzuziehen.
-
Performanter vielleicht (wobei das idR auch kein Grund für oder gegen eine Variante ist - und in zeitkritischen Programmabschnitten solltest du überhaupt keine Dateiverwaltung dazwischenklemmen), aber bestimmt nicht sicherer.