Á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;