Statt pointer eine Stringvariable nutzen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Statt pointer eine Stringvariable nutzen

Beitrag von H.Brill »

Ich habe jetzt keine Probleme damit. Habe mir extra eine Datei mit 730000 Zeilen gemacht.
Natürlich sollte man eine so große Datei nicht in eine Listbox machen. Erstens passen nicht
alle Einträge rein und zweitens dauert es ja auch, die Listbox nach jeder Zeile neu zu zeichnen.
Da nimmt man besser ein Array o.ä. dafür, also etwas ohne Anzeige. Macht ja auch keinen Sinn,
große Mengen an Daten visuell zu sichten. Und wenn, dann halt häppchenweise.

Code: Alles auswählen

Procedure.q CountLines(id.i)
	; Merke dir die aktuelle Position
	Protected position.q = Loc(id)
	Protected lines.q = 0
	; Springe an den Anfang der Datei
	FileSeek(id, 0)
	
	; Lies solange einzelne Zeilen aus wie möglich und zähle mit
	While Not Eof(id)
		ReadString(id)
		lines + 1
	Wend
	
	; Springe wieder zu alten Position zurück
	FileSeek(id, position)
	
	; Gib die Anzahl an Zeilen zurück
	ProcedureReturn lines
EndProcedure

If OpenWindow(0, 0, 0, 600, 400, "Fenster",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
   ButtonGadget(0, 10, 10, 80, 30, "Starte Lesen")

  Repeat 
      Event = WaitWindowEvent()
      If Event = #PB_Event_Gadget
         Select EventGadget()
           Case 0
             If ReadFile(0, "F:\BigFile.txt") 
                Dim zeile.s(CountLines(0))
                x.l = 0
               While Eof(0) = 0           ; sich wiederholende Schleife bis das Ende der Datei ("end of file") erreicht ist
                 zeile(x) = ReadString(0,  #PB_Ascii)  ; Zeile für Zeile einlesen
                 x = x + 1
               Wend
             EndIf  
             CloseFile(0)
             MessageRequester("Einträge", Str(x), #PB_MessageRequester_Ok|#PB_MessageRequester_Info)
       EndSelect
     EndIf   
  Until event = #PB_Event_CloseWindow
 EndIf
Zuletzt geändert von H.Brill am 14.05.2024 13:32, insgesamt 1-mal geändert.
PB 6.10
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Statt pointer eine Stringvariable nutzen

Beitrag von Kiffi »

Code: Alles auswählen

                Dim zeile.s(Lof(0))
Damit dimensionierst Du zeile.s nicht auf die Anzahl der Zeilen, sondern auf die Größe der Datei.
a²+b²=mc²
Benutzeravatar
H.Brill
Beiträge: 496
Registriert: 15.10.2004 17:42
Wohnort: 66557 Neunkirchen

Re: Statt pointer eine Stringvariable nutzen

Beitrag von H.Brill »

Aja, stimmt natürlich.

Gibt ja eine Procedur von NicTheQuick. Ist oben verbessert.
PB 6.10
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Statt pointer eine Stringvariable nutzen

Beitrag von NicTheQuick »

H.Brill hat geschrieben: 14.05.2024 13:18 Aja, stimmt natürlich.

Gibt ja eine Procedur von NicTheQuick. Ist oben verbessert.
Was meinst du damit? Welche Procedure gibt es von mir? Ich habe hier nichts darüber gepostet wie man feststellt wie viele Zeile eine Datei hat.
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Statt pointer eine Stringvariable nutzen

Beitrag von Kiffi »

NicTheQuick hat geschrieben: 14.05.2024 14:55Welche Procedure gibt es von mir?
Diese :wink:
a²+b²=mc²
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
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: Statt pointer eine Stringvariable nutzen

Beitrag von NicTheQuick »

Uh, das ist aber schon ein Weilchen her. :D
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Statt pointer eine Stringvariable nutzen

Beitrag von mk-soft »

LinkedList ...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten