Öffnungsmodus einer Datei (schnell) ändern
-
Hallo,
in meinem Projekt erzeuge ich ein Textdatei (CFile::modeText). Am ende dieser Textdatei füge ich allerdings noch eine Zahl (UINT) an. Das sieht etwa so aus:
//Zieldatei ist vom Typ CStdioFile if(offen) { CString AlsText; UINT InhaltsverzeichnisPosition = (UINT)Zieldatei.SeekToEnd(); //position merken wo das Inhaltsverzeichnis beginnt AlsText = _def_Inhaltsverzeichnis; //_def_Inhaltsverzeichnis = "//INHALTSVERZEICHNIS// AlsText += "\n"; Zieldatei.WriteString(AlsText); //Inhaltsverzeichnis in die Datei schreiben for (int i = 0; i < Inhaltsverzeichnis.GetSize(); i++) { Zieldatei.WriteString(Inhaltsverzeichnis[i] + "\n"); } //Position des Inhaltsverzeichnisses ans ende der Datei ranhängen Zieldatei.Write(&InhaltsverzeichnisPosition, sizeof(UINT));Der Trick ist ganz einfach. Sobald ich die Datei wieder öffne brauche ich (eigentlich) nur die letzen 4 Byte auslesen um die Startposition meines Inhaltsverzeichnisses innerhalb der Datei zu erhalten. Damit kann ich dann im nächsten Schritt das Inhaltsverzeichniss auslesen und auf beliebige stellen innerhalb meiner Datei zugreifen. Das hat bis jetzt auch immer super geklappt.
Allerdings (wie der Zufall es so will) wurde jetzt mal eine Datei erzeugt, bei der das Auslesen der letzten 4 Byte nicht mehr den Originalen UINT wert liefert.
Das auslesen funktioniert wie gefolgt:
if(DateiExistiert(Quelldateipfad)) { CStdioFile Quelldatei; UINT *StartByteInhaltsverzeichnis = new UINT(0); BOOL b_Erfolg; Quelldatei.Open(Quelldateipfad, CFile::modeRead | CFile::typeText | CFile::shareDenyWrite); Quelldatei.Seek( Quelldatei.GetLength() - sizeof(UINT), CFile::begin); Quelldatei.Read( StartByteInhaltsverzeichnis, sizeof(UINT)); //<-- erhält hier schon den falschen wert Quelldatei.Seek(*StartByteInhaltsverzeichnis, CFile::begin); //code welcher das Inhaltsverzeichnis ausliest }An der markierten Stelle bekomme ich also einen Wert der sich wohl nicht im ASCII Zeichensatz darstellen lässt und somit funktioniert auch der letzte Seek() Befehl nicht mehr.
Mir fällt dabei nur eine Lösung ein. Vor dem Schreiben und Auslesen der Inhaltsverzeichnisposition (tolles Wort
) müsste ich den Schreibmodus kurz auf CFile::typeBinary umstellen. Aber wie kann man das anstellen? Ich habe jedenfalls keine Funktion in der CStdioFile Klasse gefunden mit der dies möglich wäre.Hab ich also nur die Wahl die Datei zu schließen, neu zu öffen (Binär), dann wieder zu schließen und wieder zu öffnen (Text)?
-
Hmm, da fällt mir auf Anhieb nur ein, die Datei über ein zweites CFile im Binärmodus zu öffnen.
Plan B: du arbeitest rein im Binärmodus und kümmerst dich von Hand darum, daß \n korrekt weiterverarbeitet wird.
Plan C: du maskierst die eingetragene Zielposition so, daß kein \n-Byte drin vorkommen kann.
-
CStoll schrieb:
Hmm, da fällt mir auf Anhieb nur ein, die Datei über ein zweites CFile im Binärmodus zu öffnen.
Das werde ich machen. Danke
-
Ein CStdioFile ist ja ein normales CRT file, das mit fopen geöffnet wurde.
Der FILE* ist in CStdioFile::m_pStream verfügbar.
Mit _fileno besorgst Du Dir den CRT File Descriptor und mit _setmode wechselst Du auf den Mode _O_BINARY.
Sollte gehen.