Fájl megnyitása
Fájllal kapcsolatot létrehozni (azaz fájlt megnyitni) az open paranccsal lehet, ennek 3 paramétere van:
- 1.paraméter: integer típusú, a fáljhoz a csatlakozást adja meg, ennek segítségével ellenőrizhető, hogy a fáljhoz
a csatlakozás, azaz a fájl megnyitása sikeres volt-e. Ha 0 az értéke az azt jelenti, hogy nem volt sikeres.
- 2.paraméter: string típusú, a fájlnak a nevét adja meg. Ez lehet konstans ( jelen esetben "example"), de lehet változó is.
Megadhatunk benne csak fájlnevet vagy akár teljes elérési utat is.
- 3.paraméter: a fájl megnyitásának tulajdonságát állíthatjuk be. Ebben az esetben a 'put' azt jelenti, hogy létre akarjuk hozni
a fájlt. (Ezzel vigyázni kell, mert ha már létezik a fájl akkor a tartalma törlődik.)
Ennek a paraméternek az értéke lehet get is , ez azt jelenti, hogy olvasásra nyitjuk meg.
Példa kód:
open : stream, "example", put
open : stream, "example", get
Érdemes minden egyes fájl megnyitás után valamiféle ellenőrzést végezni, hogy sikerült-e a megnyitás.
Példa kód:
assert stream > 0
Ha a stream integer értéke nagyobb mint 0, az azt jelenti hogy a megnyitás sikeres, ekkor a program folytatódik.
Ha viszont stream=0, akkor program leáll és a következő hibaüzenetet küldi:
"assert condition false"
Fájl olvasása/írása
Fájlból olvasni a get, fájlba írni a put paranccsal lehet, értelemszerűen ezekhez mindig a megfelelő
módon kell a fájlt megnyitni, tehát ha olvasunk (írunk) a fájlból, akkor olvasásra (írásra) kell megnyitni,
azaz az open harmadik paramétere get (put) kell hogy legyen.
Fájlba írás úgy történik, hogy a put első paraméterének átadjuk a fájl kapcsolat változóját, a második paraméter pedig hogy
mit akarunk a fájlba írni (ez lehet string,integer,real,...)
Példa kód:
put : stream, name
put : stream, age
Fájlból olvasás tehát a get-tel. Ennél is az első paraméter a kapcsolat leírására szolgáló változó, a második pedig
hogy milyen változóba várjuk a fájlból az értéket. Ez a változó típusa megadja hogy milyen értéket várunk a fájlban.
(Fontos hogy a típusok "megfelelőek" legyenek különben hibajelzést kapunk.)
Példa kód:
get : stream, name : *
get : stream, age
ahol name string, age pedig integer
Mi van akkor ha a fájl nem egészen úgy épül fel, ahogy azt mi várnánk? Például van benne néhány nem várt space, new line
karakter. Erre az esetre a következő parancs lehet megoldás:
get : stream, skip
Ez a parancs átugarja az összes ilyen karaktereket (pl:space, new line, new page,...) és a beállítja a olvasó 'pointert' a
következő olvasandó adat elejére.
Azt is tudnunk kell fájlok olvasásákor, hogy meddig olvashatunk, mikor van vége a fájlnak.
Ehhez segítséget a következő parancs ad:
eof (stream) egy turing fájl végéhez egy fájl vége jel van hozzáfűzve. Ez a jel azt jelzi, hogy már nincs több adat amit olvasni lehet.
eof(stream) -> értéke true lesz, ha a fájl vége jelet megtaláltuk, ez azt jelenti, hogy nincs több adat amit olvasni lehetne a fájlban
Ha a fájl eltér attól, amilyennek mi "be szeretnénk olvasni", akkor hiba léphet fel. Ennek kiküszöbölésére az előző két dolgot fel
lehet használni. A megoldás az hogy minden egyes olvasás elé betesszük a következőket:
get : stream, skip
exit when eof (stream)
Ez biztosítja azt hogy egyrészt a fölösleges karaktereket átugorjuk, másrészt ha az átugrások után fájl végére érnénk,
akkor se próbáljunk meg beolvasni már.
A beolvasások tehát így néznek ki:
Példa kód:
get : stream, skip
exit when eof (stream)
get : stream, name : *
get : stream, skip
exit when eof (stream)
get : stream, age
...
Fájl zárása
Fálj lezárása, azaz a kapcsolat megszüntetése a close paranccsal történik:
close : stream
Egy paramétere van, méghozzá a fájl kapcsolat változója.
Akár olvasásra, akár írásra nyitottunk meg egy fájlt a lezárás ugyanúgy történik.
Nézzünk most akkor egy kis példát. Először létrehozunk egy fájlt, aztán meg felolvassuk:
Példa kód:
var stream, age : int
var income : real
var name : string
open : stream, "example", put
assert stream > 0
loop
put "Baratod neve vagy \"stop\" a kilépéshez"
get name : *
exit when name = "stop"
put name, " eletkora"
get age
put name, " fizetese"
get income>
put : stream, name
put : stream, age
put : stream, income
end loop
close : stream
A program segítségével egy fájlt hozunk létre és töltjük fel a begépelt adatokkal.
Név, életkor, fizetést írhatunk be, amíg egyszer "stop"-ot nem írunk névhez.
Ezeket egy fájlba beírja, a fájl valahogy így néz ki a futás után:
Bármi Áron
37
23234.12
Beviz Elek
86
1123.67
Kukor Ica
35
11235.6
Nagyonit Tas
22
3425.67
A következő kis Példa pedig ezt a fájlt olvassa és a tartalmát kiírja:
Példa kód:
var stream, age : int
var income :real
var name : string
open : stream, "example", get
assert stream > 0
loop
get : stream, skip
exit when eof(stream)
get : stream, name : *
get : stream, skip
exit when eof(stream)
get : stream, age
get : stream, skip
exit when eof(stream)
get : stream, income
put name:30, age:10, "$",income:0:2
end loop
close : stream
Fájl módosítása
Fájlok módosítása, bár nagyon egyszerű egy kissé "fárasztó". A következő eljárással oldható meg fájlok módosítása.
Először is amit módosítani akarunk fáljt azt megnyitjuk olvasásra és egy ideiglenes fájlba (amit persze írásra nyitunk meg)
átmásoljuk az eredeti fájl teljes tartalmát. Ezután a módosítandó fájlt nyitjuk meg írásra, és a temp fájlt pedig olvasásra.
A temp fájlból az adatokat olvasva, azokon a kívánt műveleteket, módosításokat elvégezve az így kapott, esetleg megváltozott
eredményt írjuk bele a fájlba.
Mindezek után már egyszerűen egy olyan kis programot írni, ami mondjuk fájlok írásánál / olvasásánál látott fájlt módosítja.
Legyen a feladat a következő: módosítsuk úgy a fentebb látott example fáljt, hogy az összes benne szereplő
embernek növeljük meg az életkorát 1-gyel és a fizetését 5000-rel.
Példa kód:
var stream1, stream2, age : int
var income :real
var name : string
open : stream1, "example", get
open : stream2, "temp", put
assert stream1 > 0
assert stream2 > 0
% example masolasa temp-be
loop
get : stream1, skip
exit when eof (stream1)
get : stream1, name : *
get : stream1, age
get : stream1, income
put : stream2, name
put : stream2, age
put : stream2, income
end loop
close : stream1
close : stream2
% most valtoztatjuk meg az adatokat es irjuk vissza a fajlba
open : stream1, "temp", get
open : stream2, "example", put
assert stream1 > 0
assert stream2 > 0 >
loop
get : stream1, skip
exit when eof (stream1)
get : stream1, name : *
get : stream1, age
get : stream1, income
put : stream2, name
put : stream2, age+1
put : stream2, income+5000
end loop
close : stream1
close : stream2