Seite 1 von 1

ReadStringFormat

Verfasst: 26.02.2017 19:53
von lite
Hallo

Möglicherweise bin ich auf einen Fehler gestoßen.
Der Fehler liegt beim ReadStringFormat Befehl.
Je nach Parameter von OpenFile ändert sich das Ergebnis von
ReadStringFormat.
Bei einer TextDatei mit Unicode-Format liefert ReadStringFormat
Ascii zurück, wen bei Openfile als Flag #PB_File_Append angegeben wird.
Sollte eigentlich Unicode sein.
Getestet mit PB 560B3.

Beispiel 1: Ergebnis = Ascii
Beispiel 2: Ergenbis = Unicode
Bitte eine Datei mit test.txt auf der Partition d:\ mit Unicode erstellen.

Beispielcode:

Code: Alles auswählen

 ; Beispiel 1:
   File = OpenFile(#PB_Any, "D:\test.txt",#PB_File_Append|#PB_File_SharedRead)
   If File
     Format.l = ReadStringFormat(File)
     Debug Str(Format)+" = "+ Str(#PB_Unicode)
     CloseFile(File)
   EndIf

 ; Beispiel 2:
   File = OpenFile(#PB_Any, "D:\test.txt",#PB_File_SharedRead)
   If File
     Format.l = ReadStringFormat(File)
     Debug Str(Format)+" = "+ Str(#PB_Unicode)
     CloseFile(File)
   EndIf 
Kann das jemand bestätigen ?

Grüße
Lite

Re: ReadStringFormat

Verfasst: 26.02.2017 20:28
von _JON_
Würde auch sage das es ein Bug ist.
Steht doch nicht in der Hilfe das der Datei Zeiger auf 0 stehen muss.
Hier mal ein Workaround.

Code: Alles auswählen

File = OpenFile(#PB_Any, "D:\test.txt",#PB_File_Append|#PB_File_SharedRead)
If File
  pos = Loc(file)
  
  FileSeek(file, 0, #PB_Absolute)
  Format.l = ReadStringFormat(File)
  FileSeek(File, pos, #PB_Absolute)
  
  Debug Str(Format)+" = "+ Str(#PB_Unicode)
  CloseFile(File)
EndIf

Re: ReadStringFormat

Verfasst: 26.02.2017 20:34
von STARGÅTE
_JON_ hat geschrieben:Steht doch nicht in der Hilfe das der Datei Zeiger auf 0 stehen muss.
Das nicht, aber ReadStringFormat() ließt ja wie jeder andere Read-Befehl einfach etwas in der Datei und dabei steht in der Hilfe:
Überprüft, ob die aktuelle Dateiposition ein BOM (Byte Order Mark) enthält.
Somit ließt es ab der aktuellen Position.

Würde ich nun nicht als Bug bezeichnen.

Re: ReadStringFormat

Verfasst: 26.02.2017 20:45
von _JON_
Oha, das mit dem Lesen hat bei mir ja nie gut funktioniert, aber jetzt echt krass :oops:

Re: ReadStringFormat

Verfasst: 26.02.2017 21:23
von ts-soft
Verstehe den unsinnigen Code sowieso nicht :mrgreen:
Es werden 2 neue Textdateien erzeugt, ohne einen BOM (entspricht ASCII)
und sollten dann Unicode sein :lol:

Da hat wohl jemand was nicht so ganz verstanden.

Kann das mal jemand verschieben, der einzige Bug sitzt vorm Monitor!

Gruß
Thomas

Re: ReadStringFormat

Verfasst: 27.02.2017 06:38
von lite
ts-soft hat geschrieben:Verstehe den unsinnigen Code sowieso nicht :mrgreen:
Es werden 2 neue Textdateien erzeugt, ohne einen BOM (entspricht ASCII)
und sollten dann Unicode sein :lol:
@TS-soft

Man muss den Code schon ausprobieren damit man das Resultat sehen kann.
Die Voraussetzung ist, das eine Text-Datei mit den Namen test.txt z.B. per Notepad
im Unicode-Format erstellt wird.
Nach deiner Aussage hast Du das nicht getan, sonst würde deine Reaktion anderes sein.

Übrigens sollte es egal sein in welcher Position der Zeiger ist.
Eine Ascii / Unicode oder UTF-8 Dabei sollte immer das Format beibehalten egal wo der Zeiger ist.
Probier es aus, und nimm Beispiel 1 und hänge bei einer Unicode-Datei zusätzlich einen Text dran. Es kommt ein Mischmasch von Unicode und Ascii raus. Das ist Käse.
Der User Jon hat das Problem erkannt.

MFG
Lite

Re: ReadStringFormat

Verfasst: 27.02.2017 08:00
von ts-soft
Die Datei wird nur durch einen sogenannten BOM am Anfang der Datei gekennzeichnet. Denn kann man natürlich auch nur
am Anfang der Datei auslesen. Steht auch deutlich in der Hilfe.

Diese Kennzeichnung ist eine Empfehlung und erst recht nicht bindent. Die meisten Textdateien werden heutzutage
im UTF-8 Format ohne BOM geschrieben.

Man kann sich also daran orientieren, wenn ein BOM am Anfang der Datei vorhanden ist, aber mehr auch nicht.

Ich sehe keinen Bug, der BOM wird ordnungsgemäß geschrieben, mehr muß dort nicht gemacht werden!

Gruß
Thomas

Re: ReadStringFormat

Verfasst: 27.02.2017 20:21
von Sicro
ReadStringFormat() und WriteStringFormat() ist nicht nur dafür da, den BOM einer Datei zu ermitteln/schreiben, sondern den BOM des folgenden Inhaltes einer Datei zu ermitteln/schreiben.
So ist es möglich, mehrere Strings mit unterschiedlichen String-Formaten (Ascii/UTF8/Unicode) in einer Datei zu schreiben und sie wieder korrekt auszulesen:

Code: Alles auswählen

FileName$ = GetTemporaryDirectory() + "Test"

If CreateFile(0, FileName$)
  
  ; WriteStringFormat(0, #PB_Ascii) ist nicht erforderlich, weil ReadStringFormat() standardmäßig Ascii ermittelt,
  ; wenn kein BOM gefunden wurde. WriteStringFormat(0, #PB_Ascii) macht aber sowieso nichts.
  WriteString(0, "Dieser String wird im Ascii-Format geschrieben.", #PB_Ascii)
  WriteAsciiCharacter(0, 0) ; Null-Zeichen schreiben, um das Ende des Strings zu kennzeichnen
  
  WriteStringFormat(0, #PB_Unicode)
  WriteString(0, "Dieser String wird im Unicode-Format geschrieben.", #PB_Unicode)
  WriteUnicodeCharacter(0, 0) ; Null-Zeichen schreiben, um das Ende des Strings zu kennzeichnen
  
  CloseFile(0)
EndIf

If ReadFile(0, FileName$)
  
  ; Ascii-String lesen
  BOM = ReadStringFormat(0)
  Debug ReadString(0, BOM)
  
  ; Unicode-String lesen
  BOM = ReadStringFormat(0)
  Debug ReadString(0, BOM)
  
  CloseFile(0)
EndIf

Re: ReadStringFormat

Verfasst: 01.03.2017 11:50
von lite
Ok, jetzt hab ich das verstanden.
Da muss man erst mal drauf kommen, das es mehrere Formate geben kann.
Danke für die Erklärung.

Lite