 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 14.03.2014, 02:29 Titel: Zahlen einlesen aus Datei - Wann ist Schluss? |
|
|
In einer Datei stehen zum Beispiel mehr als 1.000.000 Zahlen drin. Wie kann man die aus einer Datei einlesen und daraus 5 bestimmte Zahlen auf dem Bildschirm ausgeben?
Wie viel Zahlen kann man maximal aus einer Datei einlesen? Wann ist Schluss?
Code: | DIM AS ??? A = ???, Zahl(A)
DIM f AS INTEGER = FREEFILE
OPEN "Zahlen.txt" FOR INPUT AS #f
A = 0
DO UNTIL EOF(f)
INPUT #f, Zahl(A)
A += 1
LOOP
CLOSE #f
SCREENRES 640, 320, 32
COLOR &hFFFFFF
LOCATE 7,5: PRINT "A: "; A
SLEEP
LOCATE 9,5: PRINT Zahl(500)
LOCATE 11,5: PRINT Zahl(1)
LOCATE 13,5: PRINT Zahl(127)
SLEEP
END |
erste Versuche sind Fehlgeschlagen!
Es gab Speicherzugriffsverletzungen!!!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 14.03.2014, 02:54 Titel: REDIM für sehr große Arrays. Listen für wachsende Datenmenge |
|
|
Hallo ALWIM,
in FreeBASIC-Programmen, die mit der 32-Bit-Version des Compilers übersetzt wurden, können bis zu 2 GB Speicher in Beschlag genommen werden, vorausgesetzt, der PC bietet entsprechend viel freien Speicher.
Variablen, die mit DIM deklariert werden, landen standardmäßig auf dem kleinen Stack. Dessen Größe liegt normalerweise bei 1 MB, kann aber über die Kommandozeilenoption -t des fbc erhöht werden.
Variablen, die mit REDIM deklariert werden, werden auf dem Heap gespeichert. Das ist ein anderer Speicherbereich. Dort gilt nicht das Limit für den Stack.
Du kannst in FreeBASIC problemlos ein Double-Array zum Beispiel mit 10 Millionen Werten anlegen, wie das folgende Programm demonstriert. Aber auch noch mehr Einträge sind natürlich möglich.
Code: | #define AnzahlArrayElemente 10000000
ReDim Daten(1 To AnzahlArrayElemente) As Double
Randomize Timer
For i As UInteger = 1 To AnzahlArrayElemente
Daten(i) = RND * 100000
Next i
Print "Es wurden " & AnzahlArrayElemente & " Double-Array-Elemente erzeugt."
Dim As UInteger speicherbedarf = AnzahlArrayElemente * SizeOf(Double)
Print "Das Array belegt " & speicherbedarf & " Bytes, was ca. " & Int(speicherbedarf / 1024 / 1024) & " MB entspricht."
Sleep
End |
Hier sieht man das Programm in Ausführung und den Taskmanager:
Arrays haben jedoch den Nachteil, dass man bei ihrer Deklaration angeben muss, wie groß sie sein sollen. Eine nachträgliche Vergrößerung eines Arrays ist nicht möglich. Stattdessen muss ein zu kleines Array insgeheim in ein neues, größeres umkopiert werden, wenn du REDIM PRESERVE benutzt. Das ist sehr aufwendig. Sie wachsen also nicht mit dem Speicherbedarf.
Wenn am Anfang unklar ist, wie viel Speicher gebraucht wird, verwendet man statt eines Arrays eine sog. verkettete Liste. Sie kann Element für Element zu gleichen "Kosten" wachsen.
Siehe dazu zum Beispiel:
- http://www.freebasic-portal.de/downloads/bibliotheken/mdtypes-308.html
- http://www.freebasic-portal.de/tutorials/verkettete-listen-in-freebasic-37.html
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 14.03.2014, 11:31 Titel: |
|
|
Hallo ALWIM!
Was bedeuten die Fragezeichen in deinem Programmcode? Weißt du nicht, als was du die Variablen dimensionieren sollst?
Wenn die Zahlen als Strings in einem Textfile (".txt") stehen, muß das Array als STRING und die Indexvariable (A) als INTEGER dimensioniert werden.
Sollte die Datei die Werte als Zahlen enthalten (INTEGER, SINGLE oder DOUBLE) gibt es eine sehr viel elegantere Möglichkeit, auf bestimmte Werte zuzugreifen, ohne alles in ein Array zu kopieren, nämlich direkt auf die Datei über einen berechneten Dateipointer. Aber das geht nur, wenn alle Werte die gleiche Anzahl von Bytes belegen.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 14.03.2014, 15:25 Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm |
|
|
Sebastian hat Folgendes geschrieben: | ...können bis zu 2 GB Speicher in Beschlag genommen werden... |
Ist FB etwa nicht large address aware? Ansonsten können bis zu 4 GB benutzt werden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 14.03.2014, 15:52 Titel: |
|
|
Zitat: | Was bedeuten die Fragezeichen in deinem Programmcode? |
Die Fragezeichen dienen nur als Platzhalter!
Zitat: | Weißt du nicht, als was du die Variablen dimensionieren sollst? | Doch, das weiß ich schon! Ich weiß nur noch nicht wie viele Zahlen es letztendlich werden! Davon hängt ja auch die Art der Dimensionierung ab.
Ob als Integer oder als Double oder als Single! Deswegen ja auch die Fragezeichen als Platzhalter.
Im Moment habe ich bei Tests ca. 2,3 Millionen Zahlen eingelesen. Der Speicherverbrauch war enorm! Kann man es nicht so machen, dass man nur ab einer bestimmten Zeile mit dem einlesen beginnt? Dann würde man auch nicht so viel Speicher verbrauchen.
Ich danke euch schon mal für eure Hilfe!
Mal schauen, was man da machen kann! So wie es momentan ist, schaut es nicht besonders brauchbar für mich.
Jeden Tag 60 Jahre lang 100 Zahlen in 1 Minute in eine Datei schreiben und man erhält ca. 2,3 Millionen Zahlen. Wer macht das schon? von dem her wäre das noch in Ordnung? Aber was ist wenn es nicht 1 Minute sondern nur 15 Sekunden sind? oder gar 200-300 Zahlen?
Irgendwann kommen halt dann so viel Zahlen zusammen, dass das einlesen 3 Minuten oder länger dauert. Das ist meine Sorge!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 14.03.2014, 18:00 Titel: |
|
|
Ich zitiere einfach mal ganz frech
grindstone hat Folgendes geschrieben: | Sollte die Datei die Werte als Zahlen enthalten (INTEGER, SINGLE oder DOUBLE) gibt es eine sehr viel elegantere Möglichkeit, auf bestimmte Werte zuzugreifen, ohne alles in ein Array zu kopieren, nämlich direkt auf die Datei über einen berechneten Dateipointer. Aber das geht nur, wenn alle Werte die gleiche Anzahl von Bytes belegen. |
(Dazu seien mal die Stichworte BINARY und SEEK in den Raum geworfen.) _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 14.03.2014, 21:35 Titel: |
|
|
...und ergänzend dazu gäbe es aus der Rubrik "was nicht passt, wird passend gemacht" noch die Möglichkeit, alle Zahlen aus der (Text-) Datei auszulesen, in eine geeignete Zahl zu konvertieren und in eine neue Datei zu schreiben, aus der dann anschließend die Werte gezielt per Dateipointer ausgelesen werden können. Das Konvertieren dauert zwar auch eine Weile, braucht aber nur einmal gemacht zu werden.
Die maximale Dateigröße bei NTFS beträgt z.Z. ca. 16TB. Das dürfte für deine Zwecke wohl reichen .
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 17.03.2014, 02:38 Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm |
|
|
Sebastian hat Folgendes geschrieben: | Hallo ALWIM,
in FreeBASIC-Programmen, die mit der 32-Bit-Version des Compilers übersetzt wurden, können bis zu 2 GB Speicher in Beschlag genommen werden, vorausgesetzt, der PC bietet entsprechend viel freien Speicher.
Variablen, die mit DIM deklariert werden, landen standardmäßig auf dem kleinen Stack. Dessen Größe liegt normalerweise bei 1 MB, kann aber über die Kommandozeilenoption -t des fbc erhöht werden.
Variablen, die mit REDIM deklariert werden, werden auf dem Heap gespeichert. Das ist ein anderer Speicherbereich. Dort gilt nicht das Limit für den Stack.
Du kannst in FreeBASIC problemlos ein Double-Array zum Beispiel mit 10 Millionen Werten anlegen, wie das folgende Programm demonstriert. Aber auch noch mehr Einträge sind natürlich möglich.
Code: | #define AnzahlArrayElemente 10000000
ReDim Daten(1 To AnzahlArrayElemente) As Double
Randomize Timer
For i As UInteger = 1 To AnzahlArrayElemente
Daten(i) = RND * 100000
Next i
Print "Es wurden " & AnzahlArrayElemente & " Double-Array-Elemente erzeugt."
Dim As UInteger speicherbedarf = AnzahlArrayElemente * SizeOf(Double)
Print "Das Array belegt " & speicherbedarf & " Bytes, was ca. " & Int(speicherbedarf / 1024 / 1024) & " MB entspricht."
Sleep
End |
Hier sieht man das Programm in Ausführung und den Taskmanager:
Arrays haben jedoch den Nachteil, dass man bei ihrer Deklaration angeben muss, wie groß sie sein sollen. Eine nachträgliche Vergrößerung eines Arrays ist nicht möglich. Stattdessen muss ein zu kleines Array insgeheim in ein neues, größeres umkopiert werden, wenn du REDIM PRESERVE benutzt. Das ist sehr aufwendig. Sie wachsen also nicht mit dem Speicherbedarf.
Wenn am Anfang unklar ist, wie viel Speicher gebraucht wird, verwendet man statt eines Arrays eine sog. verkettete Liste. Sie kann Element für Element zu gleichen "Kosten" wachsen.
Siehe dazu zum Beispiel:
- http://www.freebasic-portal.de/downloads/bibliotheken/mdtypes-308.html
- http://www.freebasic-portal.de/tutorials/verkettete-listen-in-freebasic-37.html
Viele Grüße!
Sebastian |
Wie ist es mit Strings? Ich habe in einer Datei ein paar Wörter mit Zahlen drin stehen. Wenn ich versuche, die mit zu laden, kommt wieder die Speicherzugriffsverletzungsmeldung. Kann ich die genauso wie die Zahlen mit Redim deklarieren? Wären letztendlich genauso viele Wörter wie Zahlen.
Im Moment bin ich noch ein wenig am rumexperimentieren! Nichts klappt so wie ich will.
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 17.03.2014, 03:37 Titel: |
|
|
Evtl solltest Du Dir erst einmal im klaren sein was du eigentlich erreichen möchtest.. auch wenn ich denke das es problemlos möglich ist bis zu 2GB (oder mehr) Daten in den Speicher zu laden, halte ich es für absolut sinnlos wenn man ja nur 5 Datensätze (zahlen oder Text+Zahlen oder was auch immer) brauch...
Wieso baust du dir deine Datei nicht nach einem festen Schema auf? So das Ein Datensatz (sinnvollerweise im einem UDT) eine feste Größe hat... zB 128byte entspricht ein Datensatz, dann kannst anhand der Dateigröße ermitteln wie viele Datensätze enthalten n=(Dateigröße / 128) sind und kann dann einfach Datensatz x direkt auslesen... _________________
 |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 17.03.2014, 12:39 Titel: |
|
|
@ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. Selbst wenn du versuchst, einen Text in eine Integer-Variable einzulesen, bekommst du nur eine 0 als Wert, ansonsten arbeitet das Programm ungerührt weiter.
Es wäre hilfreich, wenn du etwas genauer erläutern würdest, was du vorhast (wieviele der Werte brauchst du tatsächlich, in aufsteigender Reihenfolge oder wild hin- und herspringend, jeden Wert nur einmal oder mehrfach... ?).
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 17.03.2014, 14:57 Titel: |
|
|
grindstone hat Folgendes geschrieben: | @ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. Selbst wenn du versuchst, einen Text in eine Integer-Variable einzulesen, bekommst du nur eine 0 als Wert, ansonsten arbeitet das Programm ungerührt weiter.
Es wäre hilfreich, wenn du etwas genauer erläutern würdest, was du vorhast (wieviele der Werte brauchst du tatsächlich, in aufsteigender Reihenfolge oder wild hin- und herspringend, jeden Wert nur einmal oder mehrfach... ?).
Gruß
grindstone |
In einer Datei stehen ein bzw. zweistellige Zahlen drin. Mit Datum und Uhrzeit versehen. 5-10 davon (die neuesten hinzugekommenden Zahlen) will ich laden.
Die Zahlen sind durcheinander und kommen mehrfach vor!
Es können theoretisch 10 Billionen Zahlen und mehr sein, die in der Datei drin stehen!
Als ich das ganze ein wenig getestet habe, war ich wahrscheinlich schon zu müde! Da werde ich nochmals meinen Grips einschalten müssen.
Zitat: | Hantierst du in deinem Programm mit irgendwelchen Pointern? |
Nein. Da muss ich mir nochmal Gedanken drüber machen!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 17.03.2014, 18:21 Titel: |
|
|
grindstone hat Folgendes geschrieben: | @ALWIM: Hantierst du in deinem Programm mit irgendwelchen Pointern? Mit normalen Dateioperationen ist es nämlich unmöglich, eine Schutzverletzung zu erzeugen. |
So eine Schutzverletzung müsste schon möglich sein, etwa wenn man Werte in Speicherbereiche liest, die außerhalb des reservierten Bereichs liegen. Dann wäre das aber auf jeden Fall kein Problem eines zu geringen Speichers, sondern einer falschen Berechnung der Array-Größe. Wie immer in einem solchen Fall lässt sich natürlich ohne zugehörigem Code hervorragend spekulieren, jedoch nichts konkretes sagen.
Meine erste Reaktion auf eine allgemeine Schutzverletzung ist immer, das Programm mit -exx zu compilieren; das findet schon eine ganze Menge. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 18.03.2014, 00:14 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | In einer Datei stehen ein bzw. zweistellige Zahlen drin. Mit Datum und Uhrzeit versehen. 5-10 davon (die neuesten hinzugekommenden Zahlen) will ich laden. Die Zahlen sind durcheinander und kommen mehrfach vor! Es können theoretisch 10 Billionen Zahlen und mehr sein, die in der Datei drin stehen!
|
Leider wissen wir immer noch nicht so recht was du eigentlich machen möchtest. Ich fasse mal zusammen:
5-10 bestimmte neu hinzugekommene Zahlen in einer Datei mit 10 Billionen Zahlen finden.
Das finden der Zahlen soll möglichst schnell gehen(keine 3 Minuten)
Eine Datei enthält als Text die Zahlen zusammen mit Datums und Zeitangaben
Eine andere Datei enthält auch Strings.
Meine Fragen:
- Hast du Einfluss auf das Format der Textdatei. Wird die Datei von einem Programm dass du selbst geschrieben hast erzeugt?
- Wie soll das genaue Format der Textdatei sein? Hast du mehr als ein Format bzw. mehrere Dateien?
Warum ließt du die Textdatei nicht rückwärts aus, solange bis die Werte gefunden wurden oder die Datei den Anfang erreicht hat bzw. bist du den Punkt erreicht hast, ab dem du im Durchgang davor schon gesucht hast?
|
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 18.03.2014, 01:42 Titel: |
|
|
Zitat: | Leider wissen wir immer noch nicht so recht was du eigentlich machen möchtest. |
Also: Ein Computerspiel (Roulette) speichert die gewonnenen Roulettezahlen mit Datum und Uhrzeit in einer Datei ab. Ich möchte lediglich die letzten 5-10 gewonnenen Roulettezahlen einlesen und auf dem Bildschirm ausgeben!
Format:
Code: | 32 04-20-2013 16:49:56
21 05-17-2013 17:19:30
7 12-17-2013 19:39:26
9 12-17-2013 19:40:04 |
so wie oben werden die Daten gespeichert!
Habe Mangels Zeit, mir nicht mehr Gedanken darüber gemacht!
Hin bekommen habe ich es vor langer Zeit schon mal. Das war damals bei einem früheren Rouletteprogramm mit Qbasic! Funktioniert allerdings mit Freebasic nicht so einfach. Komme mit dem Alt-Quellcode sehr schnell an eine der Grenzen. Mit 7 Millionen Zahlen in der Datei könnte ich gut leben. Bloß kann es sein, dass dann irgendwann das Programm nicht mehr richtig funktioniert, wegen der Speicherzugriffsverletzungen.
Ich will ja von euch keinen fertigen Quellcode haben, aber im moment komme ich da kein Stückchen weiter. Sofern ich mal ein wenig Zeit und Lust habe, werde ich das ganze nochmal in Angriff nehmen. Eine Idee habe ich schon mal! Ist halt nur ne Notlösung, aber die würde funktionieren!
Zitat: | Wie immer in einem solchen Fall lässt sich natürlich ohne zugehörigem Code hervorragend spekulieren, jedoch nichts konkretes sagen. | Den kann ich euch leider nicht liefern, da ich nichts als die obigen geposteten Zeilen (Beitrag 1) habe!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 18.03.2014, 01:57 Titel: |
|
|
Eine Anmerkung am Rande zum Thema "große Dateien":
Die Funktion "Eof" arbeitet bei Dateien >4 GB nicht korrekt. Als Workaround kann mandurchersetzen. Das liefert bei Erreichen des Dateiendes korrekt "-1" zurück.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 18.03.2014, 04:29 Titel: |
|
|
Jetzt liefere ich doch noch einen Quellcode:
Code: | REDIM SHARED Roulettezahl(10000000) As DOUBLE
REDIM SHARED gewonneneZahl(10000000) As DOUBLE
DIM SHARED AS STRING Datum
DIM SHARED AS STRING Uhrzeit
DIM SHARED k AS UINTEGER
DIM SHARED i AS UINTEGER
DIM f AS INTEGER = FREEFILE
SCREENRES 640, 320, 32
COLOR &hFFFFFF
OPEN "Test.txt" FOR INPUT AS #f
i = 0
DO UNTIL EOF(f)
INPUT #f, Roulettezahl(i), Datum, Uhrzeit
IF MULTIKEY(&h01) THEN END
i += 1
LOOP
CLOSE #f
LOCATE 5,5: PRINT "i: "; i
SLEEP
k = 1
DO
i -= 1
gewonneneZahl(k) = Roulettezahl(i)
IF k > i THEN exit DO
k += 1
LOCATE 7,5: PRINT "k: "; k
LOCATE 9,5: PRINT "i: "; i
IF MULTIKEY(&h01) THEN END
LOOP
FOR k = 1 TO i
LOCATE k, 5: PRINT USING "##"; gewonneneZahl(k)
NEXT
SLEEP
END |
Test.txt:
Code: | 32 04-20-2013 16:49:56
21 05-17-2013 17:19:30
7 12-17-2013 19:39:26
9 12-17-2013 19:40:04 |
Funktioniert doch oder?
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1279 Wohnort: Ruhrpott
|
Verfasst am: 18.03.2014, 11:14 Titel: |
|
|
ALWIM hat Folgendes geschrieben: | REDIM SHARED Roulettezahl(10000000) As DOUBLE
REDIM SHARED gewonneneZahl(10000000) As DOUBLE
... | Ist das ein neuartiges Roulette, das mit Kommazahlen arbeitet?
Und welchen Sinn hat es, die hintere Hälfte eines Arrays in umgekehrter Reihenfolge in ein zweites Array zu kopieren?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
 |
RockTheSchock
Anmeldungsdatum: 04.04.2007 Beiträge: 138
|
Verfasst am: 18.03.2014, 18:52 Titel: |
|
|
Ich habe mal ein Beispiel geschrieben wo die Datei Rückwärts eingelesen wird und ein Array mit Roulettezahlen gefüllt wird. Wobei du die indizes des Arrays auch etwas ändern kannst.
Code: | Type Roulettezahlen
wert As Integer
datum As String
zeit As String
End Type
Function Einlesen(dateiname As String, z() As Roulettezahlen) As Integer
Dim f AS Integer = FreeFile
ScreenRes 640, 320, 32
Color &hFFFFFF
Open dateiname FOR Binary AS #f
Dim i As Integer
Dim p As LongInt
Dim zeile As String
Dim zeichen As UByte
Dim leerpos As Integer,leerpos2 As Integer
Dim eingelesen As Integer
i = LBound(z)
p=Lof(f)
Do UNTIL p<1
Seek #f,p
Get #f, ,zeichen
If zeichen>31 And zeichen <128 Then
zeile = chr(zeichen)+zeile
Else
If zeichen = 13 Or p=2 Then
leerpos = InStr(zeile," ")
z(i).wert= Cint(Left(zeile,leerpos))
leerpos2=InStrRev(zeile," ")
z(i).datum=Trim(Mid(zeile,leerpos,leerpos2-leerpos))
z(i).zeit=Trim(Mid(zeile,leerpos2))
'Print zeile,z(i).wert,z(i).datum,z(i).zeit
zeile=""
i=i+1
eingelesen = eingelesen+1
If i>UBound(z) Then Return eingelesen
End If
End If
p=Seek(f)-2
IF MULTIKEY(&h01) Then End
Loop
leerpos = InStr(zeile," ")
z(i).wert= Cint(Left(zeile,leerpos))
leerpos2=InStrRev(zeile," ")
z(i).datum=Trim(Mid(zeile,leerpos,leerpos2-leerpos))
z(i).zeit=Trim(Mid(zeile,leerpos2))
'Print zeile,z(i).wert,z(i).datum,z(i).zeit
eingelesen = eingelesen+1
Return eingelesen
Close #f
End Function
ReDim zahl(-16 To -13) As Roulettezahlen
'ReDim zahl(6 To 8) As Roulettezahlen
Dim eingelesen As Integer
eingelesen = Einlesen("Test.txt", zahl())
Print "Zahlen eingelesen: ";eingelesen
sleep
For i As Integer = LBound(zahl) To UBound(zahl)
Print zahl(i).wert,zahl(i).datum,zahl(i).Zeit
Next
sleep
|
|
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 18.03.2014, 19:28 Titel: |
|
|
Statt Datum- und Zeit-Strings würde ich außerdem eher [url]Serial Numbers[/url] verwenden - sparen eine Mange Platz, und wenn dann jeder Datensatz exakt 4+8 Byte groß ist (wobei 1+8 Byte auch ausreichen würden), kannst du bequem an jede beliebige Stelle springen zum auslesen. Die Datei ist dann allerdings nicht mehr für Menschen lesbar, aber das scheint mir ja auch nicht das Ziel zu sein. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
ALWIM

Anmeldungsdatum: 08.08.2006 Beiträge: 1048 Wohnort: Niederbayern
|
Verfasst am: 18.03.2014, 20:06 Titel: |
|
|
Jetzt habe ich die ideale Lösung!
Ich erstelle 2 Dateien. In der einen Datei werden die Roulettezahlen mit Datum und Uhrzeit gespeichert. Diese wird weder gelöscht noch eingelesen.
Die andere Datei speichert ebenfalls die Roulettezahlen mit Datum und Uhrzeit, wird aber nach 5-10 gewonnenen Zahlen wieder gelöscht. Diese lese ich dann ein. So bleibt der Speicher, den ich beim einlesen verbrauche, mehr als gering!
Somit kann ich ganz normal wie gehabt "DIM" und nicht "REDIM" verwenden!
Gruß
ALWIM _________________ SHELL SHUTDOWN -s -t 05 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|