Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Anfängerfragen zum Programmieren mit PureBasic.
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von OlderCoder »

Hallo miteinander,

das sind genau solche Dinge, die mir schon immer wirkungsvoll die Freude am Programmieren versaut haben.
Weil sie sich scheinbar jeglicher Logik entziehen.

Ich habe ein Programm, in dem ich eine Textdatei zeilenweise auslesen wollte. Das habe ich schon öfter in anderen Programmen getan, ohne Probleme.
In der Textdatei stehen einige zeilenweise angeordnete Informationen. Nichts besonderes.
Aber mein Programm weigert sich strikt, diese Daten zeilenweise auszulesen. Statt dessen wird mit jedem ReadString immer nur ein einzelnes Zeichen ausgelesen.
Also habe ich voller Zuversicht diese einfache Sache auf das allernötigste reduziert, um den Fehler einzugrenzen.
Aber es ist zum Verrücktwerden.

Code: Alles auswählen

ReadFile(0,"Programmliste.txt")
While Eof(0)=0 
Debug ReadString(0)
Wend
CloseFile(0)
Dieser kleine Programmschnipsel liefert aus der geöffneten Datei nur einzelne Zeichen und gibt diese im Debugfenster untereinander aus.
Öffne ich damit aber eine andere Textdatei, die ebenfalls ähnliche Informationen enthält, werden damit plötzlich wie erwartet die Daten zeilenweise eingeladen.
Ich habe dafür überhaupt keine Erklärung.
Beide Dateien befinden sich im gleichen Verzeichnis wie das kleine Testprogramm.

Für den Fall, dass das relevant ist - was ich mir aber eigentlich nicht vorstellen kann - der Inhalt der Datei, die das Problem macht, beginnt so

Code: Alles auswählen

007 - Agent under fire (GC)	

007 - Die Welt ist nicht genug (N64)	

007 - GoldenEye (N64)	
Und die Datei, mit der es keine Probleme gibt, hat in den ersten Zeilen diesen Inhalt:

Code: Alles auswählen

; Aktuelles 1
xxx

Assetto Corsa
Hogwarts Legacy
Minecraft
Oblivion Remastered
Ich kann nur hoffen, dass Ihr mir erklären könnt, wie es zu einem solch unterschiedlichen Verhalten kommt.
Wenn nicht, verdirbt mir diese Willkür allmählich restlos die Freude am Programmieren.

LG
OlderCoder
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von NicTheQuick »

Ich kann mir nur vorstellen, dass das verschiedene Dateiformate sind. Einmal vielleicht UTF-8 und einmal Unicode.
Da ReadFile() per Default Dateien als UTF-8 liest, würde es bei Unicode direkt nach einem Zeichen stoppen, weil bei Unicode jedes Zeichen aus zwei Bytes besteht, von denen das zweite bei normalen ASCII-Zeichen wie "007" immer ein Nullbyte ist.

Um das besser zu verstehen, bietet es sich vielleicht an die beiden Textdateien mal in einem Hex-Editor zu öffnen. Dein normaler Texteditor erkennt vermutlich das Format der Textdateien automatisch richtig und dann sieht es für dich so aus als gäbe es da keinen Unterschied.

Wenn du mit Purebasic auch dynamisch auf verschiedene String-Formate reagieren können willst, schau dir mal `ReadStringFormat()` an. Allerdings ist das auch kein Garant dafür, dass es immer korrekt funktioniert, weil nicht alle Textdateien einen BOM am Anfang haben.
Axolotl
Beiträge: 266
Registriert: 31.12.2008 16:34

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von Axolotl »

versuche doch mal das Beispiel aus der Hilfe, hier wird die s.g. BOM (Format) abgefragt:

Code: Alles auswählen

  If ReadFile(0, "Text.txt")        ; if the file could be read, we continue ...
    Format = ReadStringFormat(0)
    While Eof(0) = 0                ; loop as long the 'end of file' isn't reached
      Debug ReadString(0, Format)   ; display line by line in the debug window
    Wend
    CloseFile(0)                    ; close the previously opened file
  Else
    MessageRequester("Information", "Couldn't open the file!")
  EndIf
Wie sieht denn der Inhalt aus, wenn Du einen Texteditor verwendest.
Ich verwende bspw. immer Notepad2.exe. Das zeigt mir das Encoding in der Statusleiste an.

Noch ein (modifiziertes) Beispiel aus der Hilfe, hier wird der Inhalt im PB-MemoryViewer angezeigt:

Code: Alles auswählen

   file$ = "C:\Temp\Test.txt" 
  file$ = OpenFileRequester("Select a file",file$,"Text (.txt)|*.txt|All files (*.*)|*.*",0)
  If file$
    If ReadFile(0, file$)
      length = Lof(0)                            ; get the length of opened file
      *MemoryID = AllocateMemory(length)         ; allocate the needed memory
      If *MemoryID
        bytes = ReadData(0, *MemoryID, length)   ; read all data into the memory block
        Debug "Number of bytes read: " + Str(bytes)

        ShowMemoryViewer(*MemoryID, bytes)  ; Axolotl: new 
      EndIf
      CloseFile(0)
    EndIf
  EndIf
Using PureBasic latest stable version and current alpha/beta (x64) on Windows 11 Home
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von OlderCoder »

Vielen Dank für die schnellen Antworten!
@ NicktheQuick:
Dein Name scheint wohl Programm zu sein :-)
Du hast völlig Recht. Es sind zwei verschiedene Formate. Mit Notepad++ ist das unten rechts zu erkennen.
Und mit ReadStringFormat() liegst Du ebenfalls richtig. Siehe unten.

Die Textdatei, die ich problemlos lesen kann hat das Format UTF-8.
Bei der Datei, mit der es Probleme gibt, zeigt Notepad++ rechts unten dagegen die Formatbezeichnung "UTF16 LE BOM". Gehe ich recht in der Annahme, dass die 16 ein Hinweis auf die 2 Bytes im Unicode sind? Das würde also passen.
Es gibt hier also definitiv einen Unterschied.
Was ich allerdings auch nicht verstehen kann.
Es ist immer der gleiche Weg bei mir. Ich öffne eine neue Textdatei, über den Desktop oder einen anderen Ordner, und fülle diese dann mit Inhalt.
Wie kann denn dann ein anderes Format entstehen?
Ich habe eine neue Textdatei angelegt und in diese den Inhalt der anderen kopiert. Notepad sieht hier UTF-8, und mein kleines Programm kann die Datei problemlos auslesen.
Und jedes Mal, wenn ich eine neue Textdatei öffne, entsteht eine mit UTF-8.
In diese Richtung hatte ich nicht gedacht. Tut mir leid. Sonst wäre das Problem schon damit letztlich vom Tisch gewesen.
Aber wie dieses andere Format entstanden ist, würde mich schon interessieren.

@Axolotl:
Auch Du hattest Recht mit den Formaten und mit Notepad.. Siehe oben.
Und mit dem Einsatz von ReadStringFormat() ist das Problem gelöst.
Das sollte ich vermutlich immer so machen, damit es keine Probleme dieser Art mehr gibt, oder?
Ich muss dann auch nicht mehr zwingend wissen, wie das andere Format zustande kam. Aber neugierig ist man trotzdem.

Den zweiten Codeschnipsel habe ich jetzt mal nicht angefasst, da es erstens für das Problem nicht mehr notwendig ist, und ich mich nicht noch mit anderen Themen beschäftigen/belasten wollte. Aber dankeschön.

Wieder etwas gelernt.
Danke!
LG
OlderCoder

Edit: Ich dachte immer, es gibt nichts harmloseres und einfacheres als Text-Dateien.
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von OlderCoder »

...und sorry, dass ich wegen so einer Kleinigkeit so verzweifelt rüberkam.
Wenn man sich nicht gut fühlt und kurz ein wenig Spaß haben möchte mit etwas Programmieren und dann sowas daherkommt, dann ist das ziemlich gemein. Und das habe ich nicht zum ersten Mal erlebt
Aber besonders in diesem Bereich muss man wohl immer mit dem Teufel im Detail rechnen.
Wobei es für routinierte Leute kaum mehr irgendwelche Detailteufel geben wird, aber zu denen gehöre ich nicht.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von NicTheQuick »

Zeichenkodierungen können die Hölle sein und UTF-8 sollte eigentlich schon längst überall angekommen sein, weil es alle Probleme löst, außer dass die Zeichen immer gleich viele Bytes haben.
Aber sobald irgendwas scheinbar nach ASCII aussieht, könnte es auch ISO 8859-1 sein oder was wilderes. Und dann muss man aufpassen, dass man es nicht als UTF-8 interpretiert, weil es am Anfang ähnlich aussieht.
Aber du hast vielleicht auch selbst schon mal mitbekommen wie verschiedene Shops, vor allem in Amerika, keine Sonderzeichen können. Da kannst du nicht mal im Adressfeld "Hauptstraße" oder "Saarbrücken" eingeben, weil ü und ß nicht gehen und so ein Mist. Oder viele Banken akzeptieren auch keine Sonderzeichen beim Empfängernamen, wenn du Geld überweist, und dann kann es passieren, dass die Überweisung abgelehnt wird, weil der Name nicht stimmt. Aber alles nur, weil die zu dumm sind ihre Systeme einfach mal auf einen modernen Stand zu bringen. Es ist zum Kotzen wie manche große Firmen arbeiten.
Aber naja, genug gerantet.
OlderCoder
Beiträge: 134
Registriert: 18.03.2013 12:30
Wohnort: Bayerland
Kontaktdaten:

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von OlderCoder »

Und als ich mit WriteString die Datei wieder neu zusammenbauen wollte, erhielt ich anstatt ü irgendwie das hier }¼ oder ähnlich (hab die Datei schon gelöscht) als Ergebnis. Das kennt man ja, wenn z.B. der Browser eine Site mit der falschen Textcodierung anzeigt.
Womit wir wieder beim Thema wären. Erst mit dem Parameter #PB_Ascii passte dann wieder alles.
Auch das hatte ich früher nicht.

Die Dankefunktion des Forums ist außer Betrieb, oder? Ich bekomme nur eine Fehlermeldung. Und das Icon dafür finde ich auch nur bei Dir, NicTheQuick.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von mk-soft »

Wenn du die Datei als UTF8 wieder speicherst kann du den BOM als erstes wieder schreiben, damit die anderen auch wissen das es UTF8 ist
Siehe

Code: Alles auswählen

Result = WriteStringFormat(#File, Format)
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Bitte um Hilfe - ReadString() liefert nur ein Zeichen

Beitrag von NicTheQuick »

OlderCoder hat geschrieben: 16.05.2025 16:23Die Dankefunktion des Forums ist außer Betrieb, oder? Ich bekomme nur eine Fehlermeldung. Und das Icon dafür finde ich auch nur bei Dir, NicTheQuick.
Das war nie eine Funktion des Forums, sondern von Stargate, soweit ich weiß.
Vielleicht sollte ich das mal aus meiner Signatur entfernen, wenn es eh nicht mehr funktioniert.
Antworten