Seite 1 von 1
Wie chr(0) in Datei schreiben?
Verfasst: 31.10.2010 17:22
von Syntacks_Error
Ich möchte eine Datendatei in den Speicher einlesen und die einzelnen Datensätze unterschiedlicher Länge mit peeks auslesen. Dafür brauche ich, wenn ich das richtig verstanden habe, ein chr(0) als Datensatztrenner. Aber wie schreibe ich das in die Datei?
Code: Alles auswählen
CreateFile(0,"test.txt")
For x = 1 To 5
WriteString(0,"blubb" + Chr(0))
Next
klappt nicht, da ist keine Spur eines chr(0).
Ich könnte natürlich auch einen anderen Trenner nehmen, aber dann müßte ich die einzelnen Datensätze zu Fuß identifizieren, das ist umständlich und dauert. Soll das so sein oder gibt es da eine andere Möglichkeit?
Re: Wie chr(0) in Datei schreiben?
Verfasst: 31.10.2010 17:32
von Josef Sniatecki
Es wird deshalb kein Null-Zeichen in die Datei geschrieben, weil jeder dynamisch veränderbare String in PureBasic automatisch mit einer Null terminiert wird, um das Ende eines Strings zu markieren. Hängt man nun ein weiteres Null-Zeichen an, so wird dieses einfach ignoriert, weil schon davor das terminierende Zeichen liegt, das auf ein Ende hinweist.
Einfache Lösung:
Zuerst wird ganz normal die Zeichenkette in die jeweilige Datei hineingeschrieben. Danach wird manuell ein weiteres Zeichen mit dem Code "0" eingefügt.
Gruß Josef
Edit:
Zur Verdeutlichung:
Re: Wie chr(0) in Datei schreiben?
Verfasst: 31.10.2010 17:37
von ts-soft
War mal wieder einer schneller
1. CreateFile und AllocateMemory sind in jedem Falle zu überprüfen!
2. EnableExplicit ist dringend angeraten.
Mein Beispiel geht von ASCII aus, ansonsten bitte erweitern:
Code: Alles auswählen
EnableExplicit
Define x
If CreateFile(0, "test.txt")
For x = 1 To 5
WriteString(0, "blubb")
WriteByte(0, 0)
Next
CloseFile(0)
Else
Debug "Erstellen von test.txt fehlgeschlagen!"
EndIf
; test
Define *mem, size
If ReadFile(0, "test.txt")
size = Lof(0)
If size
*mem = AllocateMemory(size)
If *mem
ReadData(0, *mem, size)
EndIf
EndIf
CloseFile(0)
EndIf
Define i, tmp.s
While i < size
tmp = PeekS(*mem + i)
i + Len(tmp) + 1 ; nullbyte und text überspringen
Debug tmp
Wend
Gruß
Thomas
Re: Wie chr(0) in Datei schreiben?
Verfasst: 31.10.2010 17:46
von Syntacks_Error
Erstaunlich, klappt, obwohl das chr(0) ja wie ein Leerzeichen in der Datei steht.
Meiner ist aber viel kürzer (Der Code, natürlich

):
CreateFile(0,"test.txt")
For x = 1 To 5
WriteString(0,"blubb")
WriteCharacter(0,0)
Next
FileSeek(0,0)
length = Lof(0)
*mem = AllocateMemory(length)
ReadData(0,*mem,length)
For x = 1 To 5
string$ = PeekS(*mem)
*mem + Len(string$) + 1
Debug string$ + "/" + Str(Len(string$))
Next
Ediit (Dafür weiß ich jetzt aber auch, wie ich das blöde len(string$) + 1 umgehe, ds wäre meine nächste Frage gewesen), beiderseits vielen Dank.
Quark, die Frage gibt es immer noch, hatte ich ganz übersehen. Gibt es für Speicher nicht auch so etwas wie loc(file)?
Re: Wie chr(0) in Datei schreiben?
Verfasst: 31.10.2010 18:27
von ts-soft
Syntacks_Error hat geschrieben:Erstaunlich, klappt, obwohl das chr(0) ja wie ein Leerzeichen in der Datei steht.
Meiner ist aber viel kürzer (Der Code, natürlich

):
Da Du weder das erstellen der Datei, noch das Allokieren des Speichers überpüfst, ist Dein
Code einfach nur Müll!
Nach meinem Hinweis in meinem erstem Posting kann ich das nur noch so ausdrücken

Re: Wie chr(0) in Datei schreiben?
Verfasst: 01.11.2010 23:56
von Vera
Code: Alles auswählen
Debug "Hello " + Chr(0) + " hui"
Debug "Hello " + Chr(Nul) + " hui"
Debug "Hello " + Chr(48) + " hui"
Da zeitgleich im englischen Forum zu Chr(0) eine ähnliche Frage gestellt wurde, verlinke ich den Thread mal hier:
Shouldn't this return an empty string?
@
ts-soft
Danke für das anschaulich und konzentrierte Beispiel
Gruß ~ Vera
Re: Wie chr(0) in Datei schreiben?
Verfasst: 02.11.2010 14:18
von Regenduft
Erkennt man zwar schon in den Beispiel-Codes, aber nochmal in Worten:
ASCII wird mit einem Null-Byte terminiert.
Unicode (UTF16) und UTF8 werden mit 2 Null-Byte terminiert.