Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Da relativ oft gefragt wird wie man eine Textdatei richtig ausliest, hab ich
mal schnell eine Funktion geschrieben. Ich hoffe ich hab alles beachtet, wenn
nicht bitte sagen.
@ milan1612:
Dein Parameter "Path" ist falsch, er sollte "File$" oder so heißen. Aber wichtiger ist, dass du das BOM nicht ganz korrekt handhabst.
Wenn ein BOM gefunden wird, wird der Lesezeiger automatisch an das Ende des BOMs gesetzt, also werden die ersten 4 Byte übersprungen. Folglich liest du immer 4 Byte zu viel ein und reservierst einen zu großen Buffer, wenn ein BOM vorhanden ist. Auch bei deinem PeekS() kommt dann die falsche Längenangabe zum Einsatz.
@AND
Danke, das mit dem BOM wusste ich nicht. Allerdings sollte man bei PeekS
lieber den Rückgabewert von ReadData verwenden. Der sagt dir nämlich wie
viel denn jetzt wirklich gelesen wurden - bei I/O-Operationen muss man da aufpassen.
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Im Grunde hast du Recht.
Ich will deines jetzt auch nicht schlecht reden, aber mir fällt spontan kein Fall ein, bei dem meine Prozedur versagen würde.
Wenn Lof() sagt, die Datei ist 10 Byte groß, wieso (unter welchen Umständen) sollte ReadData() dann weniger lesen?
AND51 hat geschrieben:Im Grunde hast du Recht.
Ich will deines jetzt auch nicht schlecht reden, aber mir fällt spontan kein Fall ein, bei dem meine Prozedur versagen würde.
Wenn Lof() sagt, die Datei ist 10 Byte groß, wieso (unter welchen Umständen) sollte ReadData() dann weniger lesen?
Das würde mich brennend interessieren.
Weiß jetzt auch nicht, aber ich dachte immer dass ja theoretisch beim Lesen
ein I/O Hardware-Fehler passieren könnte - keine Ahnung ob man das jetzt berücksichtigen sollte.
Is ja auch egal, deine Procedure funktioniert ja perfekt.
Und danke nochmal für die BOM-Berichtigung - man lernt nie aus...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
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.
Ich war auf der Suche nach Unicode-Laden und hab die Routine von milan1612 mal getestet. Leider scheint das auch nicht korrekt zu funktionieren.
Die Länge meiner UTF-16 (Unicode) Datei ist 1400 Zeichen incl. BOM (2 Byte). Die Routine liest eine korrekte Size von 1398 Bytes und nimmt das in den *buffer. Jetzt wird an PeekS() diese Size übergeben. Ich bekomme nun einen String mit 1398 Bytes(!) zurück. Die erste Hälfte ist der korrekte Text und die zweite Hälfte ist Schrott, weil der Unicode-String (2 Byte je Zeichen) in einen ASCII String gewandelt wurde (1 Byte je Zeichen). Ich hab ja keine Unicode-EXE.
If BOM.l = #PB_Unicode: Len.l = Len.l / 2: EndIf ; half the size for unicode!
Aber was mache ich bei UTF-8?
Ich bin mir nicht sicher, ob ich die Frage richtig verstanden habe, aber kann es sein dass die Flags von PeekS()
#PB_Ascii : Liest den String als ASCII, auch wenn das Programm im Unicode-Modus kompiliert wurde
#PB_UTF8 : Liest den String als UTF8 (das Programm kann sowohl im Unicode- als auch im ASCII-Modus sein)
#PB_Unicode: Liest den String als Unicode, auch wenn das Programm im ASCII-Modus kompiliert wurde