Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Zahlen einlesen aus Datei - Wann ist Schluss?
Gehe zu Seite 1, 2  Weiter
 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 14.03.2014, 02:29    Titel: Zahlen einlesen aus Datei - Wann ist Schluss? Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5969
Wohnort: Deutschland

BeitragVerfasst am: 14.03.2014, 02:54    Titel: REDIM für sehr große Arrays. Listen für wachsende Datenmenge Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 14.03.2014, 11:31    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 14.03.2014, 15:25    Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 14.03.2014, 15:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 14.03.2014, 18:00    Titel: Antworten mit Zitat

Ich zitiere einfach mal ganz frech grinsen
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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 14.03.2014, 21:35    Titel: Antworten mit Zitat

...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 zwinkern .

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 17.03.2014, 02:38    Titel: Re: REDIM für sehr große Arrays. Listen für wachsende Datenm Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Eternal_pain



Anmeldungsdatum: 08.08.2006
Beiträge: 1783
Wohnort: BW/KA

BeitragVerfasst am: 17.03.2014, 03:37    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen MSN Messenger
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 17.03.2014, 12:39    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 17.03.2014, 14:57    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 17.03.2014, 18:21    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 18.03.2014, 00:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 18.03.2014, 01:42    Titel: Antworten mit Zitat

Zitat:
Leider wissen wir immer noch nicht so recht was du eigentlich machen möchtest.

verwundert
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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 18.03.2014, 01:57    Titel: Antworten mit Zitat

Eine Anmerkung am Rande zum Thema "große Dateien":

Die Funktion "Eof" arbeitet bei Dateien >4 GB nicht korrekt. Als Workaround kann man
Code:
Eof(f)
durch
Code:
(Seek(f) > Lof(f))
ersetzen. 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 18.03.2014, 04:29    Titel: Antworten mit Zitat

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? zwinkern happy

Gruß
ALWIM
_________________
SHELL SHUTDOWN -s -t 05
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1278
Wohnort: Ruhrpott

BeitragVerfasst am: 18.03.2014, 11:14    Titel: Antworten mit Zitat

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? zwinkern

Und welchen Sinn hat es, die hintere Hälfte eines Arrays in umgekehrter Reihenfolge in ein zweites Array zu kopieren? verwundert

Gruß
grindstone
_________________
For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
RockTheSchock



Anmeldungsdatum: 04.04.2007
Beiträge: 138

BeitragVerfasst am: 18.03.2014, 18:52    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4701
Wohnort: ~/

BeitragVerfasst am: 18.03.2014, 19:28    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
ALWIM



Anmeldungsdatum: 08.08.2006
Beiträge: 1048
Wohnort: Niederbayern

BeitragVerfasst am: 18.03.2014, 20:06    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
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.

 Impressum :: Datenschutz