Lesen sequentieller Files

Es gibt 61 Antworten in diesem Thema, welches 8.034 mal aufgerufen wurde. Der letzte Beitrag (13. Mai 2023 um 08:22) ist von BIF.

  • ABER: man hat dann keine Möglichkeit mehr, das File korrekt zu schließen. Es bleibt dann mit Sternchen stehen und wenn man es löscht, wird der Platz nicht freigegeben. Ein Validate funktioniert zwar, dauert aber ewig.. ich würde gern bis zum Anschlag schreiben, weiß aber nicht, wieviel noch frei ist. Kann man das im Basic sinnvoll rauskriegen?

    Man kann eine solche Datei eventuell im Modify-Modus öffnen und dann wieder "definiert" schließen, etwa mit

    OPEN 1,8,2,"DATEI,W,M":CLOSE 1

    Dann könnte man die Datei löschen und die belegten Blöcke könnten wieder korrekt freigegeben werden, auch wenn der Blockfree-Zähler in der BAM nicht mehr steht. Mitunter geht hier trotzdem eine Block verloren, das mag ich nicht ausschließen. Jedenfalls darf man sich nicht auf den Blocksfree-Zähler verlassen, der aber für die Vergabe des Platzes auch nicht relevant ist (das wird immer über die BAM ermittelt).

  • Ja und pro Block 254 Bytes.

    Richtig. Außer bei PRG-Files, um die es hier aber nicht geht. In PRG-Dateien werden im ersten Block die ersten beiden Bytes für die Ladeadresse benötigt.

    Bei jeden Dateityp SEQ, PRG, USR und REL werden von einem Block mit 256 nur 254 für Daten verwendet und 2 Bytes sind immer der Folge-Block oder bei Track = 0 ist das der Füllstand des letzten Sektors.

    Bei PRG-Dateien ist dann von den Nettodaten noch die ersten beiden Bytes die Ladeadresse.

  • 50 print "blocks: ";asc(h$)+256*asc(l$)

    Dat muss man aufpassen, h$ oder l$ ist bei einem gelesenen 0-Byte leer.

    Hier am Anfang (aus Effizienzgründen zu empfehlen) z$=chr$(0) und dann

    50 print "blocks: ";asc(h$+z$)*256+asc(l$+z$)

    Einmal editiert, zuletzt von JeeK (16. April 2023 um 23:45) aus folgendem Grund: Korrektur Z. 50 (h$ * 256!)

  • Ich habe das probiert und natürlich spuckt der Fehlerkanal was aus und auch ST reagiert irgendwie.


    ABER: man hat dann keine Möglichkeit mehr, das File korrekt zu schließen.

    Über den Fehlerkanal kommt die Meldung "72, DISK FULL, ..." entweder wenn das Directory voll ist (hier nicht relevant) oder sobald nur noch 2 Blöcke verfügbar sind, was es zu diesem Zeitpunkt auf jeden Fall noch ermöglicht, die Datei zu schließen. Ob dir mit einer halbgeschriebenen Datei geholfen ist, sei

    ..doch, das würde mir helfen. Eigentlich prüfe ich den Fehlerkanal nach jedem Block (254 byte) da gabs m.E. keine Meldung vorher. Aber vllt. Hab ich was falsch gemacht.. ich schau mal nach morgen. Danke

    Das müsste, wie es Mike auch geschrieben hat, gehen. Fehler 72 (Disk full) lässt aus genau diesem Grund 2 Blocks "Buffer":

    Error Bitte melde dich an, um diesen Link zu sehen.: DISK FULL

    Either the blocks on the diskette are used or the directory is at its entry limit. DISK FULL is sent when two blocks are available on the 1541 to allow the current file to be closed.

  • 10 open 1,8,0,"$*=d"

    Das ist syntaktisch nicht korrekt. Hier wird auch nicht die korrekte Blockanzahl geliefert, weil es den Bitte melde dich an, um diesen Link zu sehen. D im Filter nicht gibt.

    Den * kann man weglassen, impliziert nämlich "*", der Typselektor kann dann leer gelassen werden, wodurch kein Eintrag gewählt wird und damit beim übermittelten Pseudoprogramm die 2. Zeile wirklich mit dem "BLOCKS FREE"-Inhalt kommt.

    Das sollte dann etwa so lauten, damit sich der Blocksfree-Wert ergibt:

    10 open 1,8,0,"$="

    Einmal editiert, zuletzt von JeeK (17. April 2023 um 00:10) aus folgendem Grund: Querverweis

  • printBitte melde dich an, um diesen Link zu sehen.,"m-r"chr$(250)chr$(2)chr$(3)

    Ich würd sowas lassen, weil's dann nur noch mit einer 1541 funktioniert (und mit Glück noch mit einer 1571?), aber vermutlich nicht mit dem (schnellen) VDrive in VICE oder auch sd2iec.

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • JeeK Danke für deine Ergänzungen. :thumbup:

    Das Programm oben habe ich schnell hingeschmiert, es sollte eher als "Proof of Concept" und Ausgangspunkt für eigene Entwicklungen dienen. Es ist ja auch keine Fehlerbehandlung usw. drin. :smile:

  • so, vielen Dank für die super Tipps.. Fehler 72 kommt tatsächlich 2 blocks vorher.. es lag an mit, Asche auf mein Haupt. Ich hatte die Abfrage Fehlerkanal "rausoptimiert" .. naja jetzt geht es jedenfalls.

    Die Abfrage nach freien Blocks mit dem Filter ...warum ist mir das nicht eingefallen.

  • Das sollte dann etwa so lauten, damit sich der Blocksfree-Wert ergibt:

    10 open 1,8,0,"$="

    Also damit klappt es zumindest in VICE nicht.

    Liegt vielleicht an der File System Emulation.

    [edit]

    OK, mit einem Disk-Image läuft es:

    Bitte melde dich an, um diesen Anhang zu sehen.

    [/edit]
  • Also damit klappt es zumindest in VICE nicht.

    VICE 3.7.1? Die davor waren in der Hinsicht ziemlich buggy.

    Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen.

  • VICE 3.7.1? Die davor waren in der Hinsicht ziemlich buggy.

    Nö, 3.6.1.

    Also, bei mir löppt das Programm unter VICE 3.5 und VICE 3.6.1 (jeweils Windows 11).

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Also, bei mir löppt das Programm unter VICE 3.5 und VICE 3.6.1 (jeweils Windows 11).

    Das sieht auch nicht nach "File System"-Laufwerk aus.

    Ging es darum? Dann ist das an mir vorbeigegangen.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Also, bei mir löppt das Programm unter VICE 3.5 und VICE 3.6.1 (jeweils Windows 11).

    Das sieht auch nicht nach "File System"-Laufwerk aus.

    Ging es darum? Dann ist das an mir vorbeigegangen.

    Erst nicht, aber dann habe ich "nachgetragen":

    Also damit klappt es zumindest in VICE nicht.

    Liegt vielleicht an der File System Emulation.


    [EDIT]


    OK, mit einem Disk-Image läuft es:

  • Erst nicht, aber dann habe ich "nachgetragen":

    Also damit klappt es zumindest in VICE nicht.

    Liegt vielleicht an der File System Emulation.


    [EDIT]


    OK, mit einem Disk-Image läuft es:

    Ah, ok. Diese File System Emulation benutze ich gar nicht, deswegen habe ich das wohl einfach ausgeblendet. Also Kommando zurück...

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • OK, mit einem Disk-Image läuft es:

    Also oft auch nicht, ich krieg manchnmal ?illegal quantity error in 50

    Also oft auch nicht, ich krieg manchnmal ?illegal quantity error in 50

    Dann stimmt Zeile 20 nicht - VICE hat Probleme, wenn man die mit "Paste" reinkopiert.

    Das liegt gewissermassen an der Zeile 20, zum einen koennte die unvollstaendig sein, zum andern betrifft es den Wert von "H$", eventuell auch L$.

    Ist H$, oder L$ ="", also nichts, dann steigt das Program in Zeile 50 eben mit dem besagten Fehler aus.

    Eine Abhilfe schafft hier, wenn man das Program folgendermassen abaendert:

    Code
    10 open 1,8,0,"$="
    20 fori=1to34:get#1,a$:n$=n$+a$:next:get#1,l$,h$
    25 ifl$="" then l=0:goto27
    26 l=asc(l$)
    27 ifh$="" then h=0:goto30
    28 h=asc(h$)
    30 close 1
    40 print "disk:   ";n$
    50 print "blocks:";l+256*h

    eventuell gibt es auch noch alternativen zu der von mir aufgezeigtne Loesung, aber es funktioniert auch so.

    MfG

    Claus

    "Wer einen Fehler begangen hat und ihn nicht korrigiert, begeht einen weiteren Fehler."

    (aus den Lehren des Konfuzius)

    Mein GitHub: Bitte melde dich an, um diesen Link zu sehen.