FILE

DEFINIZIOA

FILE edo fitxategi datu-mota informazio homogeneo gordetzen duen bilduma bat da. Fitxategia identifikadore bakar batez izendatuko dugu STRING bat izango dena. Fitxategi bat datu-mota bereko osagaiak dituen multzo bat da eta disko zein zintetan egon ohi da.

Fitxategiek array linealekin zerikusia dutelako jarraian datu-mota biren arteko alderaketa egingo dugu:
ESKEMA

Hona hemen zenbaki osoak gordetzen dituen array eta fitxategi baten eskemak:

Fitxategiaren eskeman agertzen den egituran, zenbaki osoak biltzen dira eta lehenago esan dugun bezala memoriatik kanpo aurkitzen da. Memoriatik kanpo dagoen egitura horri fitxategi fisiko deritzo eta hura lantzeko beharrezkoa den FILE datu-motako f aldagaiari fitxategi logiko esaten zaio.
DATU-MOTA SORTZEN

Zenbaki errealak gordetzeko fitxategiekin lan egiteko, lehenik FILE datu-mota bat deklaratuko dugu eta gero f aldagaia sortuko dugu. Baina, diskoan dagoen fitxategiak izen bat du eta horregatik erabiliko dugu STRING bat:

TYPE
DM_Fitxategi = FILE OF REAL ;
DM_Kate30 = STRING [30] ;
VAR
f : DM_Fitxategi ; { fitxategi logikoa }
sFitxIzen : DM_Kate30 ; { fitxategi fisikoa }
Diskoan dagoen informazioa atzitu ahal izateko sFitxIzen aldagaia erabiliko dugu eta fitxategiarekin lan egiteko f aldagaia (FILE datu-motatakoa) beharko dugu. Aldagai biak, noski, konputagailuaren memorian kokatzen dira. Baina konputagailuaren memorian ez dira kokatzen diskoan dauden fitxategiaren datuak.

Diskoan kokaturik dagoen egiturari fitxategi fisiko esango diogu. Adibidez, zenbaki errealak biltzen dituen DATUAK.DAT izeneko egiturari fitxategi fisiko esaten diogu eta hona hemen bere balizko eskema bat:

Fitxategi logikoa adierazten duen f aldagaia eta diskoan dagoen fitxategi fisikoa elkar uztartzeko Assign prozedura daukagu, eta elkarketa egiteko fitxategi fisikoaren izenaren bitartez lortzen da, STRING baten bitartez alegia. Ikusi eskema hauetan Assign(f,'DATUAK.DAT') prozedura aplikatu aurreko eta ondorengo egoerak:
OINARRIZKO ERAGIKETA: FITXATEGITIK IRAKURRI

Fitxategi fisikoan, diskoan, dagoen datu bat memoriara ekartzeko irakurketa bat egin behar da. Demagun f aldagaia (FILE datu-motatakoa) daukagula eta Assign(F, 'DATUAK.DAT') bitartez uztartu egin dugula 'DATUAK.DAT' izena duen diskoko fitxategiarekin.

Honela irakurtzen da datu bat f fitxategi batetik:
Read (f, rElem) ;
Non rElem aldagaia memorian dagoen eta fitxategiko datua jasoko duen. Ikusi eskema:

Irakurketa bakoitzeko elementu bakar bat irakur daiteke, fitxategiaren erakusleak adierazten duen elementua hain zuzen ere. Irakurketa gertatu ondoren erakusleak aurrera egiten du.
OINARRIZKO ERAGIKETA: FITXATEGIAN IDATZI

Memorian dagoen datu bat diskoan gordetzeko, idazketa bat egin beharko da diskoan. Demagun lehen bezala, f aldagaia daukagula uztartu egin duguna 'DATUAK.DAT' izena duen diskoko fitxategiarekin. Memorian aurkitzen den rElem aldagaian datua dago.

Honela idazten da datu hori fitxategi batean, lehen bezala f aldagaiaren bitartez:
Write (f, rElem) ;
Memorian dagoen rElem aldagaiaren edukia fitxategian idatzi. Ikusi eskema:

Hasieran, fitxategia hutsik egon da (fitxategiaren erakusle 0 posizioan dagoelako). Idazketa burutu ondoren, datu berri bat dago fitxategian eta erakusleak aurrera egiten du 1 posizioan kokatuz.

rElem aldagaiaren edukia berriztuz eta bigarren idazketa bat eginez gero, egoera honako hau izango litzateke, ikusten denez fitxategia luzatu egiten da elementu berri bat daukalako:

Baina hirugarren idazketa bat egin aurretik fitxategiaren erakuslea tokiz aldatzen badugu (horretarako Seek erabili behar da), adibidez dagoen tokitik bat atzera egin dezala erakusleak, orduan idazketaren emaitza bestelakoa da. Izan ere, fitxategiaren elementua ordezkatzen du fitxategia luzatu gabe. Beraz, hau da erakuslea posizio bat atzeratzeko agindua Seek(f, FilePos(f)-1) eta idazketa burutzean irudia honelakoak izango lirateke:

Ikusten da rElem aldagaiaren edukia berria 5.91 dela eta erakusleak posizio bat atzera egin duela, idazketa burutu ondoren elementu berriak zaharra ordezkatu du, erakusleak aurrera egin du, eta, fitxategiaren luzera ez da aldatu.
LAN EGITEKO BALIABIDEAK

Fitxategiekin trebatzeko adibideak prestatu dira. Bederatzi adibide dira eta aurreneko zortzi adibideek programa nagusia besterik ez daukate zuen arreta fitxategietara mugatzeko, bederatzigarren adibidea garrantzitsuena da bertan prozedurak eta funtzioak erabiltzen direlako.

Adibideak exekutatu aurretik bi iruzkin:
  1. sortu zuen diskoan C:\Tokia izeneko karpeta
  2. adibideak ordenez exekutatu eta landu
Adibide ariketak:
  • 1FitxategianGorde.pas fitxategi bat sortu Rewrite prozeduraren bitartez, hamar datu idatzi fitxategian, eta bukatzeko fitxategiaren edukia pantailaratu
  • 2FitxategiaIrakurri.pas existitzen den fitxategia zabaldu Reset prozeduraren bitartez, eta dituen hamar elementuak pantailaratu
  • 3FitxategiarenExistentzia.pas fitxategi existitzen den ala ez aztertu FileExists funtzioa erabiliz, funtzio honek SysUtils unitatea behar du, horregatik programaren hasieran USES SysUtils agindua derrigorrezkoa da
  • 4FitxategiaSeekFilePos.pas hurrengo idazketa ala irakurketa fitxategiaren zein posiziotan gertatuko den Seek prozedura eta FilePos funtzioarekin bermatuko dugu
  • 5FitxategiaEOF.pas fitxategiaren erakuslea fitxategiaren bukaeran dagoenean EOF funtzio boolearrak TRUE itzultzen du, End Of File egia baita
  • 6FitxategiaMoztu.pas zabalik aurkitzen den fitxategia moztu Truncate prozeduraren bitartez, erakusleak adierazten duen posiziotik aurrerako datuak galduz
  • 7FitxategiaEzabatu.pas itxita aukitzen den fitxategia ezabatu Erase prozeduraren bitartez, fitxategia diskotik ezabatuko da
  • 8FitxategiaBerrizendatu.pas itxita aukitzen den fitxategiari bere izena aldatu Rename prozeduraren bitartez, fitxategia diskotik ez da desagertuko baina izen berri bati esker atzitu ahalko dugu
  • 9FitxategiakEtaParametroak.pas prozedura eta funtzioetara fitxategiaren izena pasatuko da; azpiprograman definituko da FILE datu-motatako aldagaia, azpiprogramaren hasieran Assign egingo da eta bukaeran Close
FITXATEGIAK PARAMETRO BEZALA

Programadoreak fitxategiak lantzen dituen errutinak idaztean aukera bi izango ditu, fitxategi logikoa bidaltzea azpiprogramara (FILE datu-motako aldagaia) edo bestela fitxategi fisikoaren izena igortzea azpiprogramara (String datu-motako aldagaia).

Guk bigarren bidea erabiliko dugu, hots, azpiprogrametara fitxategi fisikoaren izena bidaliko dugu String aldagai baten bitartez. Kontutan izan dezagun, nahiz eta azpiprogramaren barruan fitxategia aldatua izan, bere izena aldatzen ez den bitartean parametroa sarrerakoa izango dela (baliozko parametroa alegia).

Azpiprogrametan fitxategiekin lan egiteko hiru urrats emango dira:
  1. fitxategi logikoa eta fitxategi fisikoa Assign bitartez elkartu, gero fitxategia irekitzeko (Reset edo Rewrite prozedurak)
  2. idazketa edo/eta irakurketa operazioak burutu (Write edo/eta Read prozedurak)
  3. fitxategia Close bitartez itxi



Fitxategiaren izena kate bat da eta gogoratu String datu-mota sinplea dela. Horregatik, azpiprograma batean honela agertuko da jokamoldearen arabera:
  • Fitxategiaren izena irteerakoa denean VAR marka izango du aurrean
  • Fitxategiaren izena sarrerakoa denean ez du inolako markarik izango
     
FITXATEGIEN GAINEKO ERAGIKETAK

Hurrengo puntuetan fitxategien gaineko zenbait eragiketa azalduko dugu, eragiketok beti azpiprogrametan gauzatuko ditugu eta horrela programa konplexu batetarako oinarrizko software zatiak izan daitezke.

Erregistroen fitxategiak landuko ditugu. Beraz hemendik aurrera honelako definizioa sarritan ikusiko dugu, non fitxategiaren elementuaren oinarria hiru eremuko erregistroa den:

TYPE
DM_sKate49 = String[49] ;
DM_rdFitxa = RECORD
sIzenDeiturak : DM_sKate49 ;
byDeialdia : Byte ;
rNota : Real ;
END ;
DM_frdFitxategi = FILE OF DM_rdFitxa ;



FITXATEGIA SORTU

FitxategiaSortu.pas adibidean fitxategi berri bat sortu eta rdFitxa datu-motako erregistroak fitxategian gordetzen dira.



FITXATEGIAREN EXISTENTZIA

Gogoratu lehenago ikusi dugun 3FitxategiarenExistentzia.pas adibidea non fitxategi baten existentzia aztertzen den FileExist funtzioa erabiliz.



FITXATEGI OSOA PROZESATU

FitxategiOsoaProzesatu1.pas adibidean existitzen den fitxategi baten edukia erakusten da. FitxategiOsoaProzesatu2.pas adibidean fitxategiaren elementu guztien byDeialdia datuak unitate batean inkrementatzen dira.



BILAKETA FITXATEGIAN

BilaketaFitxategian.pas izeneko adibidean sIzenDeiturak eremuari dagokion datu bat irakutzen da programa nagusian eta funtzio batean datu horren bilaketa gauzatzen da.



GEHIKETA FITXATEGIAN

GehiketaFitxategian.pas izeneko adibidean fitxategi bati elementu berri bat gehitzen zaio (fitxategiaren bukaeran, noski).



FITXATEGIAREN DATU BATEN ALDAKETA

DatuBatenAldaketa.pas izeneko adibidean ikasle bati dagokion rNota eremuko balioa aldatu behar zaio. Lehenik, aldatu behar den elementuaren bilaketa egiten da eta gero aldaketa gauzatzen da. Baina kontuz, nahiz eta elementuaren eremu bakarra aldatu nahi izan, fitxategitik irakurtzean edo fitxategian idaztean elementu osoa prozesatzen da.



FITXATEGIAN ELEMENTU BAT TARTEKATU

Eragiketa hau egiteko array laguntzaile bat erabiliko dugu (ikusi hurrengo bi atalak: F→A eta A→F). Gogoratu arrayen algoritmoak, konkretuki Txertaketa (arrayaren k posizio ezagun batean elementu berri bat txertatu edo tartekatu).



FITXATEGITIK ELEMENTU BAT KENDU

Kendu beharreko elementua azkena bada Truncate prozedura aplika deazkegu, gainerako kasuetan array laguntzaile bat erabiliko dugu (ikusi hurrengo bi atalak: F→A eta A→F). Gogoratu arrayen algoritmoak, konkretuki Ezabaketa (arrayaren k posizio ezagun batean dagoen elementua ezabatu).



FITXATEGI BAT ORDENATU

Eragiketa hau egiteko array laguntzaile bat erabiliko dugu (ikusi hurrengo bi atalak: F→A eta A→F). Gogoratu arrayen elementuen Ordenazioa nola lortzen zen.



FITXATEGI → ARRAY

F→A algoritmoan informazioa diskoko fitxategi batean dago eta memoriako array batera eraman nahi da. Ikusi FitxategitikArrayera.pas programa non INFORM.DAT fitxategi batetik abiatuta memoriako array bat elikatzen duen. Programaren zatirik interesgarriena prozedura hau da:
PROCEDURE FitxategiArray (VAR ardGela : DM_rdZerrenda,
VAR iLuzera : Integer,
sFitxIzen : String) ;
ARRAY → FITXATEGI

A→F algoritmoan informazioa memoriako array batean daukagu eta diskoko fitxategi batera igaro nahi da. Aurreko F→A programa ikusirik, erraz ulertzen da array batean daukagun informazioa fitxategi batera eramateko prozedura hau:
PROCEDURE ArrayFitxategi (CONST ardGela : DM_rdZerrenda,
iLuzera : Integer,
sFitxIzen : String) ;
VAR
F : DM_frdFitxategi ;
rdElem : DM_rdFitxa ;
iIndize : Integer ;
BEGIN
Assign (F, sFitxIzen) ;
Rewrite (F) ;

FOR iIndize:=BEHEMUGA TO iLuzera DO
BEGIN
rdElem := ardGela[iIndize] ;
Write (F, rdElem) ;
END ;

Close (F) ;
END ;
ADIBIDEAK

Hona hemen fitxategien zenbait programa:
Azken aldaketa: asteartea, 2013(e)ko abuztuaren 6(e)an, 14:24(e)tan