Állományok
kezelése a térképészeti számítási feladatokban
Állománynak
(fájlnak) nevezzük a háttér-tárakon tárolt, névvel ellátott adat-együtteseket.
A térképészeti adatbázisokban előfordulhatnak mind numerikus, mind
alfanumerikus információkat tartalmazó állományok. A programkészítés
szempontjából megkülönböztetünk szöveges, típusos és típus nélküli állományt.
Szöveges
állományok
A
szöveges állományok sorokból épülnek fel, a sorok pedig ASCII karakterekből
állnak. A sorok különböző hosszúságúan lehetnek. A sorok végén egy „sor vége”
jel (EOLN), az állomány végén az „állomány (fájl) vége” jel (EOF) áll. A
szöveges állományok bármely szövegszerkesztővel létrehozhatók és
szerkeszthetők. (A sorvég és a fájlvég jelek nem minden szövegszerkesztőben
látszanak.)
A
szöveges állományokban tárolt információt sorosan lehet elérni, azaz kereséskor
az állomány minden sorát át kell nézni az állomány elejétől kezdve addig, amíg
meg nem találjuk a keresett információt. A számokat legalább egy betűköz
(space) karakterrel vagy a sorvég karakterrel választjuk el egymástól.
A
szöveges állományok kiterjesztése többnyire .txt, de használható bármely más –
egyéb program által nem lefoglalt – kiterjesztés is.
A
TP programozási nyelvben a szöveges állomány azonosítóját deklarálnunk kell,
típusa: text. Ez az ún. logikai
fájlnév, amellyel a programon belül azonosítjuk az állományt. Ehhez hozzá kell
rendelnünk az operációs rendszerben használt ún. fizikai fájlnevet az Assign
utasítással. Pl. az
assign(f_nev,’adat.txt’);
utasítás
hozzárendeli az adat.txt fizikai fájlnevet az f_nev logikai fájlnévhez.
Ha
az állománnyal adatátviteli műveleteket akarunk végezni, akkor meg kell
nyitnunk. Ez – ha egy létező állományból olvasni akarunk – akkor a Reset
utasítással történik:
reset(f _nev);
Megnyitás
után az olvasás az állomány elejéről történik.
Amennyiben
egy új állományt szándékozunk létrehozni és abba írni akarunk, akkor az a
Rewrite utasítással lehetséges:
rewrite(f_nev);
Létező
állomány megnyitása a Rewrite utasítással az ott lévő korábbi információ
elvesztését eredményezi.
Ha
egy létező állományba akarunk beírni, akkor a megnyitásra az Append utasítást
kell használnunk:
append(f_nev);
Az
ezt követően beírt információ a korábbi állomány végére kerül.
A
megnyitott állományt a műveletek elvégzése után a Close utasítással kell
lezárni:
close(f_nev);
Ha
a megnyitás után az állományt megváltoztattuk és a lezárását elmulasztjuk,
akkor az állomány sérülhet.
Az
állományból történő olvasás a Read vagy a Readln eljárással lehetséges. A
read(f_nev, valtozo);
eljárás
végrehajtása eredményeként a „valtozo” nevű változó felveszi az állományban
aktuálisan következő karaktersorozat értékét. A
readln(f_nev,valtozo);
eljárás
végrehajtása következtében a „valtozo” nevű változó (vagy többelemű inputlista
esetén minden változó) felveszi az állományból beolvasott karaktersorozat
értékét; a folytatás a következő sor elején lehetséges.
Az
EOF(f_nev) logikai függvény „igaz” értéket szolgáltat, ha az elvégzett
műveleteink következtében az állomány végére (az EOF jelhez) kerültünk,
egyébként az értéke „hamis”.
Az
állományba történő írás a Write vagy a Writeln eljárással lehetséges. A
write(f_nev, ’Valami’);
eljárás
végrehajtása eredményeként az állományba íródik a „Valami” szövegkonstans, a
write(f_nev, valtozo);
eljárás
végrehajtása következtében a „valtozo” nevű változó (többelemű outputlista
esetén változók) értéke (szám vagy karaktersorozat) kerül beírásra; a további beírások
ugyanebben a sorban folytathatók. A
writeln(f_nev, ’Valami’);
és
a
writeln(f_nev, valtozo);
utasítás
az előzőektől annyiban különbözik, hogy az outputlista beírása után az aktuális
sor lezárul, és a további beírások az állomány következő sorában kezdődnek.
Grafikus
információk szöveges állományokban
A
vektoros grafikus szoftverek a képek leírására geometriai idomokat használnak,
amelyeknek alapvető építő elemei a pontok, a sokszögvonalak és a zárt
sokszögvonalak által határolt síkidomok. A vektoros grafikus állományok ezért
főleg ezen elemek attribútumait, éspedig a pontok, töréspontok x,y
síkkoordinátáit, a vonalak színét, vastagságát, típusát, a felületek színét,
kitöltésének mintázatát, stb. tartalmazzák.
A
grafikus szoftverek által elkészített és használt rajzi állományok általában
bináris állományok, ezért tartalmukat csak maga a készítő szoftver képes
felismerni. A különböző szoftverek különböző formátumokat használnak, ezért
szükség van olyan közvetítő csereformátumokra, amelyeket a fontosabb grafikus
szoftverek felismerik, és saját bináris formátumukká tudják alakítani. Ezek
közül a DXF, az AI és a HPGL formátumokat fogjuk röviden ismertetni.
A
HPGL formátum elemei
A
HPGL (Hewlett Packard Graphic Language) formátum a HP cég rajzgépei (plotterei)
által használt grafikus nyelv, amely később a rajzgépek grafikus nyelvének szabványává
vált. A HPGL rajzi utasítás állománya szöveges állomány, kiterjesztése .PLT.
Rajzi utasításokból áll, amelyeket pontosvessző választ el egymástól. A rajzi utasítások általában két betűből és
az ezt követő paraméterekből állnak, a paramétereket betűköz karakterek
választják el egymástól. A paraméterek általában méreteket (pl. koordinátákat)
megadó egész számok, amelyek
alapértelmezésben ezred inch-ben vannak megadva. Az alapvető rajzi utasítások a
következők:
IN; a
rajzolás indításához inicializálja a rajzgépet
IP X1
Y1 X2 Y2; az
aktív rajzfelület kijelölése (a téglalap átellenes P1[X1,Y1]
és P2[X2,Y2] pontjaival) – pl. A4-es fekvő
téglalap esetén:
IP 0 0 11880
8400;
SC Xmin
Xmax Ymin Ymax; az aktív rajzfelületen belül a minimális és maximális X és Y
koordináták megadása; ezzel adjuk meg az origo helyét (amely alapértelmezésben
a bal alsó sarokban van) és ha szükséges, a koordináták skálázását, vagyis az
ezred inch helyett másik rajzi egység bevezetését
SPk; a rajztoll színe k
értékétől függően:
k=1: fekete
k=2: kék
k=3: piros
k=4: zöld
k=5: magenta
(püspöklila)
k=6: sárga
k=7: enciánkék
k=0: színtelen
PUX Y; az aktuális pont
áthelyezése az X,Y koordinátájú pontba felemelt rajztollal (vagyis vonal húzása
nélkül)
PDX Y; az aktuális pont áthelyezése
az X,Y koordinátájú pontba leeresztett rajztollal, tehát a korábbi aktuális
pontból egyenes szakaszt húz az X,Y koordinátájú pontba
PDX1
Y1 X2 Y2 … Xn Yn; sokszögvonal húzása a korábbi aktuális
pontból az X1,Y1 X2,Y2 … Xn,Yn
pontokkal, mint töréspontokkal; az aktuális pont áthelyeződik Xn,Yn -be
CIr; r sugarú kör
rajzolása az aktuális pont, mint középpont körül
ARX0
Y0 alfa; az aktuális
pontból kiinduló körív rajzolása, melynek középpontja X0 Y0,
(előjeles) középponti szöge alfa
DT/,1; a kiíratandó szövegek végét
jelző karakter (esetünkben /) megadása, mely 1 esetén nem íratódik ki
LBSzöveg/; „Szöveg” szöveg kiíratása a
végjel (esetünkben /) karakterig, az aktuális pontból kiindulva ( CorelDraw-ba
történt importáláskor alapértelmezésben 8 pontos Courier New betűtípussal,
kétszeres vízszintes nyújtással)
Típusos
állományok
A
típusos állományok azonos szerkezetű adatelemekből, ún. rekordokból állnak. A
rekordok 0-tól kezdve sorszámozva vannak. Az állományon belüli rekordokhoz a
sorszámukon keresztül közvetlenül hozzáférhetünk, a tartalmukat beolvashatjuk,
vagy kiírhatunk rá információt.
A
rekordok ún. mezőkből épülnek fel. Az egy rekordot alkotó mezők száma, típusa
és sorrendje kötött, és a rekordot jellemzi. (Az egy rekordon belüli mezők
különböző típusúak lehetnek.) A típusos állomány bináris állomány, amely az
ASCII karakterektől eltérő elemeket is tartalmazhat.
A
TP nyelvben a típusos állományoknak mindenekelőtt a típusát kell deklarálni,
ami a rekordok összetételének megadását jelenti, a mezők típusának és
sorrendjének megadása által.
Type típusnév = record
mezőnév1: típus1;
mezőnév2: típus2;
…
mezőnévk:típusk;
end;
Egy
olyan változónak a deklarálása, amely egy rekordnyi információt tartalmaz:
Var változónév: típusnév;
A
fenti típusú rekordokból felépülő állomány logikai fájlnevének deklarálása:
Var fájlnév: fájl of típus;
A
végrehajtható részben a szükséges utasítások megegyeznek a szöveges
állományoknál már leírtakkal. A logikai fájlnévhez hozzárendeljük az operációs
rendszerben használt fizikai fájlnevet:
assign(f_nev,’adat.dat’);
Az
állomány megnyitása olvasásra:
reset(f _nev);
Új
állomány létrehozása és megnyitása írásra:
rewrite(f_nev);
Létező
állomány megnyitása új adatok hozzáfűzésére:
append(f_nev);
A
megnyitott állomány lezárása a műveletek elvégzése után:
close(f_nev);
A „változónév”
nevű rekord egyes mezőire való hivatkozás módja:
változónév.mezőnév1
változónév.mezőnév2
…
változónév.mezőnévn
A
TP nyelv minden típusos állományhoz egy ún. mutatót rendel hozzá, amelyik az állomány
aktuális rekordjára mutat. Az állomány megnyitása után a mutató a 0-adik
sorszámú rekordra, majd minden olvasási vagy írási művelet után az utána
jövőre, vagy – többelemű I/O lista esetén – ez elemszámmal utána következő
rekordra mutat.
A
rekordok állandó hosszúságúak, ezért a sorszámuk alapján egyszerűen
meghatározható a kezdőpontjuk. A mutató így közvetlenül bármely rekordra
ráállítható, hogy ott olvasási vagy írási műveletet végezzünk. Ez a Seek
utasítással történik:
seek(f_nev,i);
ahol
az i 4 byte-os longint típusú változó.
Az
állományból történő olvasás a Read eljárással lehetséges. A
read(f_nev, valtozo);
eljárás
eredményeként az aktuális rekord (több – egyforma típusú – elemből álló inputlista
esetén a lista elemszámának megfelelő számú rekord) kerül beolvasásra. Minden
egyes rekord beolvasása után a mutató az eggyel nagyobb sorszámú rekordra
mutat.
Az
állomány utolsó rekordjának beolvasása után az EOF(f_nev) logikai függvény
értéke „igaz” lesz, egyébként az értéke „hamis”.
Az
állományba történő írás a Write eljárással lehetséges. A
write(f_nev, valtozo);
eljárás
végrehajtása következtében a rekord típusú „valtozo” tartalma az állományba
íródik; több – egyforma típusú – elemből álló outputlista esetén a megfelelő
számú rekord kerül beírásra az állományba.
Példa:
Adatbázis
készítünk a Kis utcai kutyákról, amely tartalmazza az ebek nevét, születési
évét, fajtáját, színét és súlyát. A deklarációk:
Type
kutya=record
nev:string[20];
sz_ev:integer;
fajta:string[20];
szin:string[15];
suly:integer;
end;
Var
peldany:kutya;
falka:file of kutya;
A
végrehajtható részben a „peldany” nevű rekord mezőinek pl. a következő módon
adhatunk értéket:
peldany.nev:=’Bundás’;
peldany.sz_ev:=2009;
peldany.fajta:=’keverék’;
peldany.szín:=’sárga foltos’;
peldany.suly:=27;