Zeichenkette am Ende einer Datei entfernen

Hallo,

zurzeit stellt sich mir folgendes Problem: Ich habe eine Datei, an deren Ende ich springen muss, um (meistens) bestimmte acht Zeichen zu entfernen.

Man kann sich die Datei vorstellen, wie ein XML-Dokument

<begin>
<tag>Inhalt</tag>
</begin>

Nun möchte ich zwischen die Zeile "<tag>Inhalt</tag>" und "</begin>" noch eine weitere anhängen, sodass es vielleicht entsprechend so aussieht:

<begin>
<tag>Inhalt</tag>
<tag2>Inhalt2</tag2>
</begin>

Was ich nun mache ist folgendes:
- Einlese der Datei in einen String (mOldContent)
- mOldContent->remove(mOldContent->lastIndexOf("</begin>"), 8);
- mOldContent->append(*mNewContent);
- mOldContent->append("</begin>");

Das funktioniert auch recht einfach, nur kann es sein, dass (JA! Kunde...) die Datei bis zu 50MB groß wird. Und wer weiß wie groß noch.... Das Einlesen in einen String würde in dem Szenario also zuviel Zeit brauchen - unsinnig Zeit, wie ich finde.

Gibt es nun irgendeine Möglichkeit der "low level" Dateioperationen, wo der Inhalt nicht erst komplett in einen String geschrieben wird und ich später mittels String-Matching mir mein gewünschten Teilstring heraussuche und damit hantiere, sondern die Datei direkt durchsuche, und entsprechend manipuliere?

Ich arbeite mit folgenden Utensillien: WinXP, Qt 3.11, Visual Studio 2008.

Falls jemand Fragen oder Vorschläge hat, bitte her damit!




LG KK
 
Hi, ich habe das zwar noch nicht ausprobiert aber vielleicht funktioniert das.
Kannst du nicht einfach ans Ende der Datei springen 8 Backspaces anfügen und dann deinen Text anfügen?
Ich habe das bisher nur in der Konsole ausprobiert, wo es jedoch funktioniert hat.

Gruß Jennesta
 
Hi.

@Jennesta: Nein, das funktioniert nicht.

@KartoffelKiffer: Du könntest die Stelle in der Datei suchen wo du etwas einfügen willst. Dann liest du beginnend von dieser Stelle alles bis zum Dateiende aus, gehst an die Stelle zurück, überschreibst den Inhalt mit dem neuen Text und schreibst zum Schluss noch den gespeicherten Text rein.

Gruß
 
Du musst die Datei mit mode "r+" zum Ändern öffnen, kannst dann mit fseek (file,-8,SEEK_END) an die 8-letzte Position gehen und dort deinen neuen Inhalt reinschreiben. Anschließend machst du noch einen fflush-Aufruf und kannst die Datei schliesen.
 
Zuletzt bearbeitet:
Hallo zusammen,

erstmal danke für die Hilfe!

@Vereth: Genau so habe ich es nun auch gemacht!

Code:
FILE *f;
	f = fopen(mFileName.toAscii(), "r+");
	if (f != NULL)
    {
        fseek(f, -8, SEEK_END);
		fwrite(mNewContent->toAscii(), mNewContent->size(), 1, f);
		const char end_tag[] = "</begin>";
		fwrite(end_tag, sizeof(char)*strlen(end_tag), 1, f);
		fclose(f);
    }

Nur gehe ich jetzt definitiv davon aus, dass am Ende der Datei mein gewünschter 8-Zeichen langer Text steht. Ist dem nicht so, wird die Datei invalide, da mein Text "irgendwo" eingefügt wird.

Gibt es nun noch eine Art Suchfunktion auf Dateiebene, wo ich wirklich die Startposition der Zeichenkette </begin> bekomme, sodass ich direkt an die Position springen kann?



LG KK
 
Nein, dazu musst du deinen Dateirest, in dem du dein </begin> vermutest, in einen buffer einlesen (Anhängen von '\0' nicht vergessen!) und mit strstr suchen, wo das letzte Vorkommen deines Tags ist; dann weißt du, wohin du deinen Dateizeiger mit fseek positionieren musst, um deine gewünschte Zusatzinfo zu schreiben. Denke aber auch daran, die Zeichen auch noch anzuhängen, die hinter deinem </begin>-Tag stehen, am besten schreibst du das direkt aus deinem buffer zurück.
 
Zurück