Dateien einlesen und damit arbeiten

Anfängerfragen zum Programmieren mit PureBasic.
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Dateien einlesen und damit arbeiten

Beitrag von PB42 »

Hallo,

ich will aus einer Datei Zahlen einlesen und dann damit im Programm arbeiten (z.B. als erste Übung Doubletten herausfinden). Die PB-Hilfe nutzt mir absolut nichts. Kann mir mal bitte jemand einen kurzen Musterquellcode schreiben, wie man sowas macht? Vielen Dank.

PB42

edit.: Eilt nicht, ist ja schon spät. Morgen ist auch noch ein Tag.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

Wenn deine Zahlen als LONGs in der Datei vorliegen dann so:

Code: Alles auswählen

ReadFile(1, Datei$)
 Zahl1 = ReadLong(1)
 Zahl2 = ReadLong(1)
 ;...
CloseFile(1)
Wenn deine Zahlen als Text vorliegen, getrennt mit einem "Trannungszeichen" (",",".","_",...) dann so:

Code: Alles auswählen

ReadFile(1, Datei$)
 String$ = ReadString(1)
 Zahl1 = StringField(String$, 1, Trennzeichen$)
 Zahl2 = StringField(String$, 2, Trennzeichen$)
 ;...
CloseFile(1)
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich nehme an, du willst als Übung z. B. 100 Zufallszahlen in eine Datei schreiben, pro zeile eine Zahl? Diese Datei dann wieder auslesen und die doppelten Zahlen filtern?

Das ist ganz einfach! So erstellst du die Datei:

Code: Alles auswählen

If Not CreateFile(0, "C:\test.txt")
   Debug "Datei kann nicht erstellt werden"
   End
EndIf

For n=1 to 100
   WriteStringN(0, Str(Random(10)))
Next

CloseFile(0)
Diesen Code habe ich aus dem Kopf geschrieben, sollte funktionieren!

So liest du die Zahlen ein (ich lese die Zahlen in eine LinkedList ein):

Code: Alles auswählen

If Not ReadFile(0, "C:\test.txt")
   Debug "Datei kann nicht gelesen werden"
   End
EndIf

NewList zahlen.l()

While Not Eof(0)
   AddElement(zahlen())
      zahlen()=Val(ReadString(0))
Wend

CloseFile(0)

; Ab hier werden Dubletten gefiltert
; Beste und schnellste Methode: Jedes Element mit allen nachfolgenden Elementen vergleichen!

Debug "Die Liste hat vorher "+Str(CountList(zahlen()))+" Elemente"

For element=0 to CountList(zahlen())-1
   SelectElement(zahlen(), element) ; Ein Element wählen
   Define element_inhalt=zahlen() ; Dieses Element merken
   While NextElement(zahlen()) ; Alle nachfolgenden Elemente durchgehen
      If zahlen() = element_inhalt ; Wenn das eben gemerkte Element gleich dem aktuellen Element ist, dann löschen
         DeleteElement(zahlen())
      EndIf
   Wend
Next

Debug "Nach der Filterung hat die Liste noch "+Str(CountList(zahlen()))+" Elemente"
Auch diesen Code habe ich mal eben aus dem Kopf getippt.
// Edit: Mal eben 3 Dusseligkeitsfehler korrigiert (EndIf vergessen und so) :-)

Ich persönlich bevorzuge diese Methode der Dublettenfilterung.
Natürlich kann man auch, wie einige andere es tun, die Liste sortieren (SortList()), dann stehen alle Dubletten hintereinander. Meine Methode kommt jedoch ohne Sortierung aus; das ist notwendig, denn es kann ja oft Situationen geben, in der die Reihenfolge der Elemente z. B. durch Sortieren nicht verloren gehen darf.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Ich hab mir das alles erstmal abgespeichert und mache dann morgen damit meine ersten Gehübungen. Wenn ich nicht klarkommen sollte, melde ich mich halt nochmal.

Danke erstmal.

PB42
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

@STARGÅTE:

Aber selbst bei 3.3 würd das nen Fehler produzieren ...

Da musst du bei deinem 2. Beispiel noch ein VAL() benutzen... ist doch'n String...

Code: Alles auswählen

Zahl2 = Val( StringField(String$, 2, Trennzeichen$)) 
Frohe Weihnachten ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

ja klar lol, aber ich teste halt kleine codes nicht :oops:
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

Hallo,

ich habe mich heute stundenlang mit dem Einlesen einer kleinen Datai beschäftigt, aber der Code, der dabei entstanden ist, um mit den eingelesenen Zahlen in Form von Variablen auch arbeiten zu können, statt die Zahlen nur im Debugger ansehen zu können, ist so schlimm, daß ich den hier nicht einstellen will. Es muß doch einen effizienten Weg geben, mit dem man z.B. die Zahlenreihen

1, 12, 15, 24
13, 61, 39, 43

nacheinander in Variablen abspeichern und bearbeiten kann, z.B., um mal übungshalber in der ersten Reihe Vielache von 12 zu finden und in der zweiten dann Vielfache von 13. Es gibt aber in PureBasic nicht sowas wie EndOfRow(). Falls da jemand weiter weiß, wäre ich dankbar.

PB42
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag von STARGÅTE »

also deine Datei ist also das hier :
MeineDatei.txt hat geschrieben: 1, 12, 15, 24
13, 61, 39, 43
gut dann ist hier dein gewünschter Code:

Code: Alles auswählen

If ReadFile(1, "MeineDatei.txt")
 Repeat
  Zeile$ = ReadString(1)
  Index = 1
  While StringField(Zeile$,Index,", ") <> ""
   Zahl = Val(Trim(StringField(Zeile$,Index,",")))
   If Zahl % 13 = 0
    Debug Str(Zahl)+" ist duch 13 teilbar."
   EndIf
   If Zahl % 12 = 0
    Debug Str(Zahl)+" ist duch 12 teilbar."
   EndIf
   Index + 1
  Wend
 Until Eof(1)
 CloseFile(1)
EndIf
Ergebnis:
12 ist duch 12 teilbar.
24 ist duch 12 teilbar.
13 ist duch 13 teilbar.
39 ist duch 13 teilbar.
Zuletzt geändert von STARGÅTE am 27.12.2007 01:44, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag von Kiffi »

STARGÅTE hat geschrieben:

Code: Alles auswählen

[...]
StringField(Zeile$,Index,", ")
1. Das Trennzeichen in StringField sollte korrekterweise mit nur einem
Zeichen angegeben werden.

2. Es sollte immer geprüft werden, ob Dateioperationen funktioniert haben:

Code: Alles auswählen

If ReadFile(1, "MeineDatei.txt") 
 [...]
Grüße ... Kiffi
a²+b²=mc²
PB42
Beiträge: 243
Registriert: 13.10.2005 03:21

Beitrag von PB42 »

@STARGATE

Ist ja phänomenal, das klappt echt super! Das ist alleridngs ein Code, wo ich jetzt nicht kappiere, warum der läuft, denn das mit den %-Zeichen habe ich noch nie gesehen. Kriege ich vielleicht noch raus. Vielen Dank!

@Kiffi
Auch natürlich Danke.

Ich ziehe echt den Hut vor Leuten, die so schnell helfen können Dank ihres Programmierkönnens.

PB42
Antworten