30. Súbory: Open, Close a vstup a výstup cez kanály

Na čo to je

Čo program vypočíta, sa po vypnutí stratí – pokiaľ to neuloží do súboru na disketu. Rovnakým spôsobom, akým sa číta a píše súbor, komunikuje Atari so všetkými zariadeniami: s obrazovkou, klávesnicou aj tlačiarňou.

Zariadenia a kanály

Každé zariadenie má meno z jedného písmena a dvojbodky:

MenoZariadenie
E:editor – obrazovka a klávesnica spolu (to, cez čo si doteraz písal a čítal)
K:klávesnica – jeden stlačený kláves, bez čakania na RETURN
S:obrazovka v grafickom režime
P:tlačiareň
D:disketa; za dvojbodkou je meno súboru: D:NOTES.TXT
C:kazeta

Meno súboru na diskete má najviac 8 znakov, bodku a najviac 3 znaky prípony, veľkými písmenami.

Program so zariadením nehovorí priamo, ale cez kanál – očíslovanú „linku“ 0 až 7. Najprv kanál otvorí, potom cez neho číta alebo píše, a nakoniec ho zavrie.

KanálKto ho používa
0E: – otvorený od začiatku; sem píše Print a odtiaľ číta InputS
1 až 5voľné pre tvoj program
6S: – otvára ho Graphics
7K: – preto GetD(7) čaká na kláves

Ako sa to píše

Action!
Open(kanál, "meno", režim, 0)
…
Close(kanál)
RežimVýznam
4čítanie
8zápis – súbor sa vytvorí; ak existoval, prepíše sa
9pripisovanie na koniec existujúceho súboru
12čítanie aj zápis
6čítanie zoznamu súborov na diskete (meno je potom maska, napr. "D:*.*")

Rutiny, ktoré poznáš, majú verziu pre kanál – s písmenom D (device) v mene a číslom kanála ako prvým parametrom:

Na obrazovkuNa kanál
Print(s), PrintE(s)PrintD(k, s), PrintDE(k, s)
PrintB(n), PrintBE(n)PrintBD(k, n), PrintBDE(k, n)
PrintC, PrintIPrintCD, PrintID (a s E na konci)
Put(c), PutE()PutD(k, c), PutDE(k)
InputS(s)InputSD(k, s)
InputB(), InputC(), InputI()InputBD(k), InputCD(k), InputID(k)
–GetD(k) – funkcia, vráti jeden znak (bajt)

Koniec súboru: EOF je pole knižnice. Keď čítanie z kanála k narazí na koniec súboru, EOF(k) prestane byť nula.

Celý program

Súbor examples/files.act:

Action!
; Files: write three lines to a disk file and read them back

PROC Main()
  CHAR ARRAY line(80)
  BYTE count

  Open(1, "D:NOTES.TXT", 8, 0)        ; 8 = write (a new file)
  PrintDE(1, "The first line")
  PrintDE(1, "The second line")
  PrintD(1, "Number ")
  PrintBDE(1, 42)
  Close(1)
  PrintE("The file is written.")
  PutE()

  count=0
  Open(1, "D:NOTES.TXT", 4, 0)        ; 4 = read
  DO
    InputSD(1, line)
    IF EOF(1) THEN
      EXIT
    FI
    count==+1
    PrintB(count)
    Print(": ")
    PrintE(line)
  OD
  Close(1)

  PutE()
  PrintB(count)
  PrintE(" lines read.")
RETURN

Preklad a spustenie

Tento program beží aj v simulátore:

action26 files.act --sim

Simulátor má „disketu“ len v pamäti: súbor existuje, kým program beží, a potom zmizne.

V emulátore potrebuje program skutočnú disketu s operačným systémom diskov (DOS). Ako sa to robí, je v kapitole 34; v skratke – skopíruj si obraz diskety s DOS-om (napríklad dos25.atr) a napíš:

action26 files.act --atr dos25.atr --run

Program sa uloží na disketu tak, aby sa po zapnutí Atari sám spustil, a súbor NOTES.TXT na nej ostane.

Čo uvidíš

The file is written.

1: The first line
2: The second line
3: Number 42

3 lines read.

Ako to funguje

Zápis. Open(1, "D:NOTES.TXT", 8, 0) otvorí na kanáli 1 nový súbor. PrintDE(1, …) doň píše presne to, čo by PrintE napísal na obrazovku. Tretí riadok vznikne z dvoch príkazov, ako na obrazovke. Close(1) súbor zavrie – až vtedy je naozaj celý na diskete.

Čítanie. Súbor sa otvorí znova, tentoraz v režime 4. Slučka číta riadok po riadku cez InputSD. Po každom čítaní sa pozrie na EOF(1): keď je nenulové, riadok sa už neprečítal a slučka končí.

Test konca súboru je za čítaním a pred spracovaním riadka. Koniec sa totiž zistí až pri pokuse čítať ďalej.

Posledný parameter Open je pri bežnej práci vždy 0.

Čítanie po bajtoch

Textové súbory sa čítajú po riadkoch cez InputSD. Iné súbory – obrázky, dáta hry – sa čítajú po bajtoch:

Action!
Open(1, "D:PICTURE.DAT", 4, 0)
DO
  value=GetD(1)
  IF EOF(1) THEN EXIT FI
  …                    ; spracuj value
OD
Close(1)

Zápis po bajtoch je PutD(1, value).

Ďalšie operácie s diskom

RutinaČo robí
XIO(k, 0, 33, 0, 0, "D:MENO.TXT")zmaže súbor
XIO(k, 0, 32, 0, 0, "D:STARE.TXT,NOVE.TXT")premenuje súbor
XIO(k, 0, 35, 0, 0, "D:MENO.TXT")zamkne súbor proti zmazaniu; 36 odomkne
Note(k, @sektor, @posun)zapamätá si miesto v otvorenom súbore (do CARD sektor a BYTE posun)
Point(k, sektor, posun)vráti sa na zapamätané miesto

XIO je všeobecný príkaz pre zariadenie; kanál k musí byť voľný (zatvorený). Tieto operácie a zoznam súborov (režim 6) skúšaj v emulátore s disketou – simulátor vie spoľahlivo len čítať, písať a pripisovať. Note a Point dovoľujú skákať v súbore – napríklad vrátiť sa na začiatok záznamu bez čítania všetkého pred ním.

Časté chyby

Čo sa staloČo sa stane
súbor na čítanie neexistujeErr: 170 a program skončí
kanál je už otvorenýErr: 129
čítanie alebo zápis na neotvorený kanálErr: 133
chýba Close po zápisekoniec súboru sa na disketu nedostane
režim 8 na existujúci súborstarý obsah je preč
v emulátore nie je disketa s DOS-omErr: 130 – zariadenie D: neexistuje
riadok v súbore je dlhší ako poleInputSD prepíše pamäť; použi InputMD(k, pole, veľkosť), ktorá dĺžku stráži

Chyba pri práci so zariadením program ukončí výpisom Err: a čísla. Ako ju zachytiť a pokračovať, ukáže nasledujúca kapitola. Čísla chýb sú v prílohe C.

Vyskúšaj si

  1. Zmeň režim druhého Open zo 4 na 9 a namiesto čítania pripíš do súboru ďalší riadok. Potom súbor prečítaj.
  2. Nechaj používateľa písať riadky (InputS) a ukladaj ich do súboru, kým nezadá prázdny riadok (dĺžka 0).
  3. Vypíš obsah diskety: otvor "D:*.*" v režime 6 a čítaj riadky ako zo súboru. (V emulátore s disketou.)

Zhrnutie

Späť: 29. Joystick a náhoda · Ďalej: 31. Bloky pamäte a chyby