Wie chr(0) in Datei schreiben?

Anfängerfragen zum Programmieren mit PureBasic.
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Wie chr(0) in Datei schreiben?

Beitrag 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?
Benutzeravatar
Josef Sniatecki
Beiträge: 657
Registriert: 02.06.2008 21:29
Kontaktdaten:

Re: Wie chr(0) in Datei schreiben?

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

Code: Alles auswählen

WriteString(File, "Hello")
WriteCharacter(File, 0)
Zuerst wird ganz normal die Zeichenkette in die jeweilige Datei hineingeschrieben. Danach wird manuell ein weiteres Zeichen mit dem Code "0" eingefügt. :wink:

Gruß Josef

Edit:
Zur Verdeutlichung:

Code: Alles auswählen

Debug Len("Hello")
Debug Len("Hello" + Chr(0))
PB 4.61 | Windows Vista - 32Bit
Homepage

"Wahrlich es ist nicht das Wissen, sondern das Lernen, nicht das Besitzen sondern das Erwerben, nicht das Dasein, sondern das Hinkommen, was den grössten Genuss gewährt." - Carl Friedrich Gauß
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: Wie chr(0) in Datei schreiben?

Beitrag von ts-soft »

War mal wieder einer schneller :wink:

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
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
Syntacks_Error
Beiträge: 107
Registriert: 08.03.2009 16:08

Re: Wie chr(0) in Datei schreiben?

Beitrag 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 :D ):
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)?
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: Wie chr(0) in Datei schreiben?

Beitrag 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 :D ):
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 :freak:
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
Vera
Beiträge: 928
Registriert: 18.03.2009 14:47
Computerausstattung: Win XP SP2, Suse 11.1
Wohnort: Essen

Re: Wie chr(0) in Datei schreiben?

Beitrag 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
°
<°)))o><
~~~~~~~~~
echo "Don't worry"
echo "Keep quiet"
@echo off
format forum:\
Benutzeravatar
Regenduft
Beiträge: 574
Registriert: 25.03.2008 15:07
Wohnort: THE LÄÄÄND!

Re: Wie chr(0) in Datei schreiben?

Beitrag 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.
PureBasic 5.73 LTE x86/x64 | Windows 7 (x64)
Antworten