ReadStringFormat

Für allgemeine Fragen zur Programmierung mit PureBasic.
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

ReadStringFormat

Beitrag 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
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: ReadStringFormat

Beitrag 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
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: ReadStringFormat

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: ReadStringFormat

Beitrag von _JON_ »

Oha, das mit dem Lesen hat bei mir ja nie gut funktioniert, aber jetzt echt krass :oops:
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ReadStringFormat

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: ReadStringFormat

Beitrag 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
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: ReadStringFormat

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: ReadStringFormat

Beitrag 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
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
lite
Beiträge: 122
Registriert: 27.08.2012 21:08

Re: ReadStringFormat

Beitrag 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
Antworten