ReadString und sein Parameter length

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Hubsi

Betreff: ReadString und sein Parameter length

BeitragMi, Nov 30, 2016 17:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Tach beisammen,

bastel gerade wieder mit Bmax rum und hab ein Problem mit ReadString bekommen. Da wird die Länge des Strings verlangt und ich frage mich nun wieso das von Blitz nicht schon beim schreiben des fraglichen Strings in die Datei mit reinpackt. Wenn ich den String (und damit die Länge) kennen würde müsste ich ihn ja nicht aus der Datei holen Mr. Green Ich umgehe die Geschichte jetzt mit Write/ReadLine, weils für die Aufgabe jetzt wurscht ist, aber der Hintergrund zu der Sache würde mich interessieren Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

FireballFlame

BeitragMi, Nov 30, 2016 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Stream aus dem du liest, muss nicht unbedingt eine Datei sein, der könnte prinzipiell sonstwo herkommen. Aber davon abgesehen:
Wenn du WriteString benutzt, wird eben genau der String geschrieben, den du angegeben hast. Wenn du z.B. hintereinander "a", "b" und "c" schreibst, dann steht in deiner Datei hinterher "abc" und daraus kann man natürlich nicht erkennen, in welchen Einzelstücken das hineingeschrieben wurde. Muss man ja z.B. auch nicht, wenn die Strings alle eine vorher bekannte Länge haben.
Wenn du die geschriebenen Strings aber voneinander trennen willst und sie unbekannte Längen haben, gibt es zwei Möglichkeiten:
Entweder du schreibt die entsprechende Länge vor jeden String, damit du später weißt, welche Länge du bei ReadString angeben musst. Das kannst du ganz einfach mit WriteInt und ReadInt machen.
Oder du schreibt jeweils irgendein Trennzeichen dazwischen. Das ist genau das, was WriteLine macht: es hängt an jeden String noch "~r~n" (also carriage return und newline) an . ReadLine ignoriert dann das "~r" und liest so lange, bis es ein "~n" findet. (Oder auch ein "~0", das könntest du stattdessen also auch als Trenner benutzen. Für andere Trennzeichen müsstest du dir dann selbst was basteln, oder den Code von WriteLine/ReadLine kopieren und entsprechend abändern.
PC: Intel Core i7 @ 4x2.93GHz | 6 GB RAM | Nvidia GeForce GT 440 | Desktop 2x1280x1024px | Windows 7 Professional 64bit
Laptop: Intel Core i7 @ 4x2.00GHz | 8 GB RAM | Nvidia GeForce GT 540M | Desktop 1366x768px | Windows 7 Home Premium 64bit

Thunder

BeitragDo, Dez 01, 2016 2:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Die BB-Funktionen ReadString und WriteString waren sehr schlecht designt.
Wenn ich einen String habe, den ich 1:1 in eine Datei schreiben will, geht das in BB nicht.
WriteString hängt die Länge des Strings davor und WriteLine hängt CR und LF an (ASCII Control Zeichen).

Mit BlitzMax' WriteString kann ich einen String 1:1 in eine Datei schreiben und das Verhalten von
den BB Funktionen emulieren, wenn ich Lust habe. Siehe unten.
Damit ist diese Variante der Funktionen überlegen.

BlitzMax: [AUSKLAPPEN]
Function WriteStringBB(f:TStream,s:String)
WriteInt f, s.length
WriteString f, s
EndFunction

Function ReadStringBB:String(f:TStream)
Local n = ReadInt(f)
Return ReadString(f, n)
EndFunction

Code ist ungetestet, aber die Bedeutung sollte klar sein.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

Hubsi

BeitragDo, Dez 01, 2016 17:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Das leuchtet mir ein, danke Very Happy An andere Streams, wie wegen meiner Netzwerk, hab ich gar nicht gedacht. Aber wenn man das mal zu Ende spekuliert hat das freilich seine Richtigkeit Very Happy
Den ganzen Doag im Bett umanandflagga und iaz daherkema und meine Hendl`n fressn...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group