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:

Append-Anweisung

 
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: 23.03.2022, 17:01    Titel: Append-Anweisung Antworten mit Zitat

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



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

BeitragVerfasst am: 23.03.2022, 18:12    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 23.03.2022, 19:00    Titel: Antworten mit Zitat

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



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

BeitragVerfasst am: 23.03.2022, 19:20    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 23.03.2022, 19:37    Titel: Antworten mit Zitat

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



Anmeldungsdatum: 05.02.2022
Beiträge: 175

BeitragVerfasst am: 31.03.2022, 14:03    Titel: Antworten mit Zitat

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