Tutorial
RANDOM-Tutorial
Hmm, wenn dieser Record dem Compiler bekannt ist(und das ist er, sonst würde das Speichern ja nicht funktionieren), dann müsste auch SizeOf() funktionieren. Bingo, SizeOf(Adressen) gibt die Länge des DatenTyps aus und das ist 100.
(Dann ist es auch kein Wunder, dass die Ausgabe nicht in Ordnung ist.)
Bevor wir also selbst ausrechnen, was FreeBASIC unserer Meinung nach benutzen müsste, ist es sicherer, die Funktionen von FreeBASIC zu benutzen. Gern weise ich in diesem Zusammenhang nochmal auf die Funktion FreeFile hin, die immer einen freien Datei-Handle liefert und deshalb besser verwendet werden sollte(gerade bei größeren Programmen) als die manuelle Vergabe, um Konflikte zu vermeiden.
Die Struktur des verwendeten Records sollte den Benutzern des Programms stets mitgeteilt werden, da sonst Fehleingaben gewissermaßen 'vorprogrammiert' sind. Auch bietet es sich an, die Konstanten für den Record an einer leicht auffindbaren Stelle des Programmes unterzubringen, falls die Struktur mal geändert werden sollte. Vorsicht, falls das erforderlich wird, können die Dateien, die mit der alten Struktur geschrieben wurden, nicht mehr richtig gelesen werden!!!
So, wer sich jetzt noch kein eigenes Programmbeispiel geschrieben hat, bekommt es jetzt hier:
Randomize Timer
Const VornameLen=20, NachnameLen=30, WohnortLen=40, Dateiname="Personen.Dat", MaxEintrag=4
Type Adressen
Vorname As String*VornameLen 'damit es auch mehrere Vornamen sein dürfen
Nachname As String*NachnameLen 'es kann ja auch Doppelnamen geben
Alter As Integer 'auch ein Integer hat eine feste Länge: 4
Wohnort As String*WohnortLen 'damit auch Stadtteile benutzt werden können
End Type
Dim As Adressen DatenListe(1 To MaxEintrag), TestEintrag
Dim As Integer DatenFile=FreeFile, i, RecordLaenge=SizeOf(TestEintrag), j
Open Dateiname For Random As #DatenFile Len=RecordLaenge
For i=1 To MaxEintrag
With DatenListe(i)
Read .Vorname, .Nachname, .Alter, .Wohnort
End With
Put #DatenFile, , DatenListe(i)
Next i
Close #DatenFile
i=SizeOf(TestEintrag.Vorname)
j=i
?i
i=SizeOf(TestEintrag.Nachname)
j+=i
?i
i=SizeOf(TestEintrag.Alter)
j+=i
?i
i=SizeOf(TestEintrag.Wohnort)
?i
?j+i
?RecordLaenge
For i=1 To MaxEintrag
With DatenListe(i)
? .Vorname &" " &.Nachname &", " &.Alter &", " &.Wohnort
End With
Next i
Data "Ben", "Cartwright", 199, "Ponderosa", _
"Joe", "Dalton", 41, "Wilder Westen", _
"Lois", "Lane", 22, "Metropolis", _
"Marge", "Simpson", 34, "Springfield"
'Jetzt Testeintrag benutzen, um zu zeigen, daß es klappt^^
Do
Input "Welche Adresse lesen(0=Ende):", i
If i And i<=MaxEintrag Then
Open Dateiname For Random As #DatenFile Len=RecordLaenge
Get #DatenFile, Int(Rnd*MaxEintrag+1), TestEintrag
With TestEintrag
Print .Vorname &" " &.Nachname &", " &.Alter &", " &.Wohnort
End With
Close #DatenFile
End If
Loop Until i=0
Print "Eniki..";
Print Input(1)
Jetzt kommen wir auf Rnd() zurück ;-))
Bei dem oben erwähnten Beispiel mit den Songs wäre es ganz praktisch, wenn der Rechner automatisch einen Song auswählen würde..
Dazu wird die Funktion Int(Rnd*MaxEintrag+1) benutzt, die immer einen Eintrag aus 1..MaxEintrag liefert ;-))
Wenn dann noch als erste Zeile Randomize Timer benutzt wird, ist die Reihenfolge immer zufällig(also auch RANDOM).
(aber das steht ja auch in der Referenz..)
Interessant ist natürlich auch die letzte Zeile, die demonstriert, wie einfach ein Tastendruck abgefragt werden kann, ohne dass der Tastaturpuffer hinterher noch 'gewartet' werden muss^^
So, das war erstmal eine Einführung(!!) in die Dateiverwaltung mit RANDOM xD
Viel Spaß beim Organisieren der 70000 Songs^^
Gruß
ytwinky
Gehe zu Seite
1 2 3
Zusätzliche Informationen und Funktionen |
- Das Tutorial wurde am 21.01.2008 von ytwinky angelegt.
- Die aktuellste Version wurde am 07.09.2017 von avrfreund gespeichert.
|
|