Ich schreibe den header in der Tat immer als ASCII in die Datei, da er von mir so definiert wurde und eine feste Länge haben soll (48 Bytes).
Beim Schreiben gehe ich so vor, dass ich jedes Strukturfeld einzeln schreibe und bei den Strings durch entsprechende Berechnung mit SizeOf(Character) in beiden Fällen (ASCII und Unicode mode) die korrekte Anzahl an Zeichen schreibe. Das Casten nach ASCII übernimmt dann WriteString() für mich.
Code: Alles auswählen
If CreateFile(0, *this\sFilename, #PB_Ascii)
; Schreiben des Datenbank-Headers
WriteString(0, *this\strBHC_Header\sMagicWord, #PB_Ascii)
WriteWord(0, *this\strBHC_Header\wDatabaseType)
WriteString(0, Left(*this\strBHC_Header\sUserdefinedDatabaseTypecode + Space(SizeOf(strBHC_Header\sUserdefinedDatabaseTypecode) / SizeOf(Character)), SizeOf(strBHC_Header\sUserdefinedDatabaseTypecode) / SizeOf(Character)), #PB_Ascii)
WriteLong(0, *this\strBHC_Header\lVersion)
WriteString(0, Left(*this\strBHC_Header\sDescription + Space(SizeOf(strBHC_Header\sDescription) / SizeOf(Character)), SizeOf(strBHC_Header\sDescription) / SizeOf(Character)), #PB_Ascii)
; ... weiterer code
CloseFile(0)
ProcedureReturn #True
Else
ProcedureReturn #False
EndIf
Beim Einlesen einer solchen Datei möchte ich mittels FileSeek() diesen Header ggf. überspringen und hätte dabei gern
benutzt, da ich dann bei einer Erweiterung des Headers diese Stelle nicht mit anpassen müsste.
Momentan habe ich mir aber einfach eine Konstante mit der Länge des Headers definiert, so muss ich bei einer Erweiterung des Headers keine weiteren Anpassungen vornehmen.