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:

Problem mit Random-Datei

 
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 11.03.2022, 18:14    Titel: Problem mit Random-Datei Antworten mit Zitat

ich habe eine Datei mit Open for Random definiert. Beim Schreiben in die Datei habe ich keine Probleme allerdings beim Lesen.
Ich habe einen kurzen Code beigelegt. Bis zum GET erscheint mir alles soweit in Ordnung aber nach dem GET hänge ich. (Hab leider nicht gefunden wie ich eine Datei anhängen kann)

Code:
DIM AS STRING Rey2
Dim as integer satznr2, recordLength2, Rey1, fr = FREEFILE
DIM AS BYTE Rey4
TYPE RecordType2
   Rey1 AS INTEGER         
   Rey2 AS STRING * 25      
   Rey3 AS integer         
   Rey4 AS BYTE         
END TYPE
DIM record2 AS RecordType2
recordLength2 = LEN(RecordType2)
OPEN "\SIPPUNGSADMIN\Dateien\DATEN.DAT" FOR RANDOM ACCESS READ WRITE SHARED AS #fr LEN = recordLength2
'
GET #fr, Satznr2, Record2
PRINT Rey1, Rey2, Rey4

Edit:
um meine Frage zu präzisieren: ich habe herausgefunden, wie ich eine Feld aus den Record (z.B. Rey) in Print verwenden kann:

GET #1, satznr, record1
WITH record1
   PRINT .Rey1
END WITH


aber für die weitere Verabeitung kann ich sie nicht verwenden, z.B. Umspeichern in eine andere Variable (Rey1a = .Rey1). Ich konnte zwar mit LEN(.Rey1) die Länge bestimmen (4 weil Integer) aber ich kann sie weder umwandeln (Val(Rey1)) noch direkt damit rechnen (= 3 * .Rey1)
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1208
Wohnort: Ruhrpott

BeitragVerfasst am: 12.03.2022, 17:02    Titel: Antworten mit Zitat

Bevor du aus der Datei etwas lesen kannst, mußt du etwas hineinschreiben. Und dann solltest du dir die Befehlsreferenz zum Thema TYPE(UDT) noch einmal etwas genauer ansehen.
Code:
Dim As Integer satznr2, recordLength2, fr = FreeFile

Type RecordType2
   Rey1 As Integer
   Rey2 As String * 25   
   Rey3 As Integer   
   Rey4 As Byte   
End Type

Dim record2 As RecordType2
Dim getrec As RecordType2

recordLength2 = Len(RecordType2)

Open ExePath + "\DATEN.DAT" For Random Access Read WRITE Shared As #fr Len = recordLength2

With record2
   .Rey1 = 1
   .Rey2 = "ABCDEF"
   .Rey3 = 10
   .Rey4 = 200
End With

satznr2 = 10

Put #1, satznr2 , record2

Get #fr, Satznr2, getrec
With getrec
   Print .Rey1, .Rey2, .Rey3, .Rey4
End With

Close #fr


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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 12.03.2022, 17:32    Titel: Antworten mit Zitat

Hallo grindstone,

danke für deine Antwort.
Die Datei habe ich schon mit einem anderen Programm befüllt, da hatte ich kein Problem. Nachdem ich auch gesehen habe wie man aus einer Date liest und ausdruckt habe ich die befüllte Datei auch überprüfen können.

Bei meiner Frage geht es aber darum was ich machen muss damit ich die Felder des eingelesenen Records auch weiter verarbeiten kann. Denn sobald ich sie in anderen Befehlen außer Print verwende bekomme ich beim Kompilieren Fehlermeldungen.

TYPU(UDT) habe ich mir diesbezüglich auch schon angesehen, habe aber den Knackpunkt nicht gefunden, werde mir das aber nochmals ansehen, danke.
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.03.2022, 02:09    Titel: Antworten mit Zitat

kilix hat Folgendes geschrieben:
Bei meiner Frage geht es aber darum was ich machen muss damit ich die Felder des eingelesenen Records auch weiter verarbeiten kann. Denn sobald ich sie in anderen Befehlen außer Print verwende bekomme ich beim Kompilieren Fehlermeldungen.

Kannst du dazu mal ein kurzes Beispielprogramm posten? Dann sehen wir vielleicht, wo das Problem liegt.
_________________
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 13.03.2022, 10:17    Titel: Antworten mit Zitat

Ich denke, das Problem ist gelöst. Der Fehler dürfte in meinem Programm an anderer Stelle liegen denn nachdem ich in das obige Beispiel die Befehle
Dim as Integer Rey1a
Dim as String Rey2a
Rey1a = Rey1
Rey2a = Rey2
eingebaut hatte funktionierte es wie von mir erwartet. D.h. ich muss den Fehler wo anders suchen. Das dürfte aber mit dem Beispiel von grindstone nicht mehr schwer sein.

Danke für eure Hilfe und Geduld!
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.03.2022, 12:48    Titel: Antworten mit Zitat

Nur so eine Vermutung:

Der korrekte Aufruf lautet ja
Code:
Rey1a = record2.Rey1

und lässt sich wegen des WITH so verkürzen, wie es grindstone oben verwendet hat. Kann es sein, dass du außerhalb des WITH auf .Rey1 zugreifen wolltest, ohne das eigentliche Objekt (hier record2) anzugeben?
_________________
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 13.03.2022, 15:29    Titel: Antworten mit Zitat

Danke für den Hinweis! Ich hatte das im Thread schlampig geschrieben. So wie ich es schrieb hab ich es im Programm in WITH verwendet. Die andere Schreibweise kenne ich aber auch.
Was der Fehler nun war/ist weiß ich noch nicht. Ich schreibe gerade an einem Programm das die aus einem Vorsystem (csv-Datei) übernommenen und in einer Random-Datei gespeicherten Datensätze am Schrim listet, um zu sehen ob sie auch richtig übernommen wurden. Auf Grund des Fehlers habe ich ganz neu begonnen und orientiere mich an dem Code von grindstone.
Er hat in seinem Code die Datei zuerst mit put befüllt und dann den Satz mit get eingelesen.
Für das Schreiben schrieb er: Dim record2 As RecordType2
und für das Lesen: Dim getrec As RecordType2
Das heißt, dass man für Schreiben und Lesen andere Record-Variable verwenden muss wenn Put und Get für diese Datei in einem Programm sind?
Bei mir trifft das zwar dzt. nicht zu weil ich dafür 2 Programme habe aber es interessiert mich natürlich weil das oft vorkommen kann.
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.03.2022, 16:22    Titel: Antworten mit Zitat

Du musst keine neue Variable verwenden, aber mit der neuen Variablen kannst du besser prüfen, ob das Lesen korrekt funktioniert hat. Wenn du beim Lesen die alte Variable wiederverwendest und der Lesevorgang in der Form fehlschlagen sollte, dass die alte Variable unverändert bleibt, kann man das Problem nicht erkennen - man erhält ja das richtige Ergebnis, nur aus den falschen Gründen.

Ob es besser ist, eine neue Variable zu verwenden oder eine alte wiederzuverwerten, hängt auch vom konkreten Einsatz ab.

Btw ... magst du nicht mal OPEN FOR BINARY ausprobieren? Das kann alles, was OPEN FOR RANDOM auch kann, ist aber flexibler. (Außerdem garantieren die fbc-Entwickler nicht für die korrekte Funktionsweise von OPEN FOR RANDOM; das wird hauptsächlich aus Gründen der Abwärtskompatibilität unterstützt.)
_________________
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 13.03.2022, 16:51    Titel: Antworten mit Zitat

, ich habe mir Binary in der Zwischenzeit angesehen. Mir ist auch klar wie ich zum ersten Byte des gewünschten Sates komme. Wie es weitergeht weiß ich noch nicht, geht das mit Type und with wie bei Random oder muss ich die Felder über die Feldlängen bestimmen?
Aber da komme ich noch hin, möchte jetzt mit Random fertig machen, das ist mir von meiner früheren Programmierung noch geläufiger. Muss langsam machen denn es ist doch schon 35 Jahre her, dass ich DEC Basic Plus programmiert habe und das nur nebenbei.
_________________
Grüße
kilix
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



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

BeitragVerfasst am: 13.03.2022, 17:06    Titel: Antworten mit Zitat

Du kannst ein komplettes UDT lesen oder schreiben; dann wandert der Dateizeiger automatisch weiter. Da gibt es dann keinen Unterschied zu OPEN FOR RANDOM.
Wenn du auf einen konkreten Eintrag zugreifen willst, musst du noch mit der Länge des UDTs multiplizieren, z. B.
Code:
open "test.dat" for binary as #1
get #1, 1+(satznr-1)*sizeof(RecordType2), record2
close #1

unter der Annahme, dass nur diese Art von Records verwendet wurden (OPEN FOR BINARY ist darauf aber nicht angewiesen).
_________________
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
kilix



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 13.03.2022, 19:23    Titel: Antworten mit Zitat

Danke! Ich habe mir das Beispiel gespeichert. Werde das beim nächsten Programm anwenden!
_________________
Grüße
kilix
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
Seite 1 von 1

 
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