Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 11.03.2022, 19:14 Titel: Problem mit Random-Datei |
|
|
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 |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 12.03.2022, 18:02 Titel: |
|
|
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 |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 12.03.2022, 18:32 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.03.2022, 03:09 Titel: |
|
|
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 |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 13.03.2022, 11:17 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.03.2022, 13:48 Titel: |
|
|
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 |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 13.03.2022, 16:29 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.03.2022, 17:22 Titel: |
|
|
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 |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 13.03.2022, 17:51 Titel: |
|
|
, 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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.03.2022, 18:06 Titel: |
|
|
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 |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 13.03.2022, 20:23 Titel: |
|
|
Danke! Ich habe mir das Beispiel gespeichert. Werde das beim nächsten Programm anwenden! _________________ Grüße
kilix |
|
Nach oben |
|
|
|