|
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 |
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 23.03.2022, 18:01 Titel: Append-Anweisung |
|
|
ich habe eine Datei bei der immer wieder mal Datensätze am Ende hinzugefügt werden. So wie ich das verstehe macht man das mit
Code: |
OPEN Dateiname FOR APPEND [ ... ]
|
Nun habe ich dazu aber keinen Bezug auf RANDOM- oder BINARY-Dateien gesehen. Ich nehme aber doch an, dass man für weitere Verarbeitungen dieser Datei sie im RANDOM- oder BINARY-Mode öffnen kann.
Das führt mich auch zur nächsten Frage: kann eine Datei in einem Programm als RANDOM und in einem anderen als BINARY geöffnet werden?
Da bin ich mit nicht sicher denn ich meine wo gelesen zu haben, dass bei Random am Feldende ein "" und am Satzende 3 Zeichen (welche?) gespeichert werden. Bei Binary dürfte das aber wegen der Berechnung auf des Startbyte eines Satzen nicht so sein? _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 23.03.2022, 19:12 Titel: |
|
|
APPEND öffnet eine Datei zunächst einmal mit Schreibzugriff, ohne die Inhalte zu löschen, und setzt den Dateizeiger ans Ende der Datei. Mit RANDOM und BINARY kannst du Dateien ebenfalls mit Schreibzugriff öffnen, und die bestehenden Inhalte werden ebenfalls nicht gelöscht (jedenfalls nicht, wenn du sie nicht selbst überschreibst). Der Dateizeiger befindet sich aber in beiden Modi, soweit ich weiß, am Dateianfang. Das ist kein wirkliches Problem, weil du ihn ja jederzeit dorthin setzen kannst, wohin du magst. Du kannst daher, wenn du willst, RANDOM und BINARY genauso einsetzen wie APPEND (abgesehen davon, dass APPEND für sequentiellen Datenzugriff vorgesehen ist, was aber letztlich auch egal ist, weil FreeBASIC das nicht so strikt unterscheidet. Solange du nicht bestehende Inhalte verwerfen willst (OUTPUT), könntest du eigentlich auch immer BINARY nehmen und per Hand Lese-/Schreibberechtigung und Startposition des Dateicursors setzen.)
RANDOM arbeitet auf jeden Fall immer mit festen Blockgrößen. Ehrlich gesagt kenne ich die Details bei RANDOM nicht, aber ich glaube nicht, dass sie sich zu denen von BINARY unterscheiden. Es sollte da immer das komplette UDT gespeichert werden, und das bedeutet bei FreeBASIC (unabhängig von RANDOM oder BINARY): An Strings wird immer ein CHR(0) angehängt, und UDTs werden für gewöhnlich auf ein Vielfaches einer bestimmten Zweierpotenz ausgedehnt (standardmäßig 4 oder 8, aber das lässt sich mit FIELD anpassen). Ich habe das etwas ausführlicher hier beschrieben:
https://users.freebasic-portal.de/nemored/buchBeginner/07_UDTs.htm#kap7_3
Wenn du mit BINARY ein komplettes UDT schreibst bzw. einliest, arbeitet es genauso. Wenn du die einzelnen Attribute aber einzeln schreibst bzw. liest, geht das Padding natürlich verloren. _________________ 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: 23.03.2022, 20:00 Titel: |
|
|
ich bin jetzt verwirrt.
Du schreibst:
Zitat: |
Der Dateizeiger befindet sich aber in beiden Modi, soweit ich weiß, am Dateianfang. Das ist kein wirkliches Problem, weil du ihn ja jederzeit dorthin setzen kannst, wohin du magst.
|
Nachdem ich die Datensätze mit konstanter Länge immer hinten dran hängen will muss ich wissen welcher Datensatz der letzte ist (egal ob mit RANDOM oder BINARY) damit ich den PUT-Befehl auf den nächsten Datensatz adressieren kann. Dazu muss mir aber der Dateizeiger dorthin zeigen. Wie kann ich ihn dorthin setzen?
SEEK und EOF sind für sequentielle Dateien. D.h. LOF dürfte hier der richtige Befehl sein weil er das letzte belegte Byte meldet. Also muss der nächste Datensatzauf Adresse LOF+1 beginnen?
Edit: hab's gerade ausprobiert. Da ich noch keinen Datensatz gespeichert habe gibt mit LOF den Wert 0 zurück. Ich kann also das PUT auf Satz LOD+1 setzen. Meine Frage scheint damit beantwortet zu sein! _________________ Grüße
kilix |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 23.03.2022, 20:20 Titel: |
|
|
SEEK und EOF funktionieren auch bei binären Dateien; wie gesagt macht da FreeBASIC keinen großen Unterschied. Allerdings sagt dir EOF nur, ob du dich am Ende der Datei befindest, und nicht, wo sich dieses Ende gefindet (wenn du gerade woanders bist). LOF sollte auf jeden Fall funktionieren.
Nur immer aufpassen, welche Befehle von 0 zählen und welche von 1; das ist etwas wirr, und ich muss das auch immer mal wieder nachschlagen.
edit: Arbeitest du jetzt mit RANDOM oder BINARY? Bei RANDOM klappt LOF+1 so vermutlich nicht; da musst du sicher noch durch die Record-Länge teilen. _________________ 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: 23.03.2022, 20:37 Titel: |
|
|
Ich arbeite noch mit RANDOM, das ist mir einfach von früher her vertraut. Auch habe ich ausnahmslos konstante Satzlängen weil ich nur einfache Daten speichere und mit STRING; INTEGeR und BYTE auskomme.
Bilder, Grafiken etc. speichere ich nicht.
Danke für den Hinweis, dass ich das Ergebnis von LOF durch die Satzlänge dividieren muss, um den letzten Satz zu erhalten. Das war mir aber bewußt, das LOF das letzte Byte zeigt.
Ich muss mich nochmals für eure Hilfe bedanken! Inzwischen habe ich schon einige Programme erstellt und komme mit meinem Projekt ganz gut weiter. Allerdings hat das alles jede Menge Zeit denn obwohl ich eine Vereinsapplikation schreibe, die bei uns auch anwendbar wäre (wenn sie gut wird) ist es nur eine private Beschäftigung die mir Spaß macht. _________________ Grüße
kilix |
|
Nach oben |
|
|
kilix
Anmeldungsdatum: 05.02.2022 Beiträge: 175
|
Verfasst am: 31.03.2022, 15:03 Titel: |
|
|
Hallo nemored,
habe alle OPEN-Befehle auf BINARY umgeschrieben.
Eigentlich habe ich es nur gemacht weil RANDOM nicht mehr aktuell ist und, wie ich verstanden habe, wahrscheinlich in Zukenft auch nicht mehr unterstützt wird.
Was mein Projekt betrifft sehe ich sonst eigentlich leine Vorteile weil es in meiner Anwendung genügt immer auf den vollen Datensatz zuzugreifen wofür GET mit satznr und TYPE genügen. Auf spezielle Bytes innerhalb eines Record wie es mit Binary möglich ist, muss ich nie direkt zugreifen.
Aber sonst funktioniert es praktisch gleich wie RANDOM. Nur die Satznummer für GET und PUT muss immer berechnet werden. _________________ Grüße
kilix |
|
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.
|
|