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:
| Meno | Zariadenie |
|---|---|
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ál | Kto ho používa |
|---|---|
| 0 | E: – otvorený od začiatku; sem píše Print a odtiaľ číta InputS |
| 1 až 5 | voľné pre tvoj program |
| 6 | S: – otvára ho Graphics |
| 7 | K: – preto GetD(7) čaká na kláves |
Ako sa to píše
Open(kanál, "meno", režim, 0)
…
Close(kanál)| Režim | Význam |
|---|---|
| 4 | čítanie |
| 8 | zápis – súbor sa vytvorí; ak existoval, prepíše sa |
| 9 | pripisovanie 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 obrazovku | Na kanál |
|---|---|
Print(s), PrintE(s) | PrintD(k, s), PrintDE(k, s) |
PrintB(n), PrintBE(n) | PrintBD(k, n), PrintBDE(k, n) |
PrintC, PrintI | PrintCD, 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:
; 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.")
RETURNPreklad a spustenie
Tento program beží aj v simulátore:
action26 files.act --simSimulá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 --runProgram 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:
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 neexistuje | Err: 170 a program skončí |
| kanál je už otvorený | Err: 129 |
| čítanie alebo zápis na neotvorený kanál | Err: 133 |
chýba Close po zápise | koniec súboru sa na disketu nedostane |
| režim 8 na existujúci súbor | starý obsah je preč |
| v emulátore nie je disketa s DOS-om | Err: 130 – zariadenie D: neexistuje |
| riadok v súbore je dlhší ako pole | InputSD 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
- Zmeň režim druhého
Openzo 4 na 9 a namiesto čítania pripíš do súboru ďalší riadok. Potom súbor prečítaj. - Nechaj používateľa písať riadky (
InputS) a ukladaj ich do súboru, kým nezadá prázdny riadok (dĺžka 0). - Vypíš obsah diskety: otvor
"D:*.*"v režime 6 a čítaj riadky ako zo súboru. (V emulátore s disketou.)
Zhrnutie
- Zariadenia majú mená
E:,K:,S:,P:,D:meno. Open(kanál, meno, režim, 0)otvorí,Close(kanál)zavrie. Režim 4 číta, 8 píše, 9 pripisuje.- Rutiny s
Dv mene pracujú s kanálom:PrintDE,InputSD,GetD,PutD. EOF(kanál)je nenulové po dosiahnutí konca súboru.- Bez
Closezápis nie je dokončený.
Späť: 29. Joystick a náhoda · Ďalej: 31. Bloky pamäte a chyby