A szövegfájlok karaktereket tartalmazó különböző hosszúságú sorokból épülnek fel.
A SeekEoLN(fájlváltozó) akkor is jelzi a sor végét, ha az aktuális fájlpozíció és a sor vége között csak szóköz vagy tabulátor karakterek állnak.
EOLN #13#10 (CR,LF) <ENTER>
EOF #26 <CTRL+Z>
A szövegfájl a szekvenciális állományokhoz tartozik: tartalmát az elejétől olvashatjuk, vagy felülírhatjuk. Lehetőség van a fájl végétől kezdődő hozzáírásra is.
A fájlkezelés lépései
Az állományok tartalmának eléréséhez az oprendszertől és a programnyelvtől függetlenül mindig ugyanazokat a főbb lépéseket kell végrehajtani: előkészületek, megnyitás, feldolgozás fájlműveletekkel, az állomány lezárása.
a) Előkészületek
A lemezen tárolt állományokat a fájlváltozóval azonosítjuk. Deklarálása:
var változónév : TextFile;
A megfelelő típusú fájlváltozó létrehozása után, az AssignFile eljárás segítségével össze kell rendelni a fájlváltozót egy létező vagy új állomány nevével.
AssignFile(fájlváltozó, fájlnév elérési útja )
Ha az elérési utat nem adjuk meg, akkor a hivatkozás relatív lesz, tehát ott keresi majd a fájlt, ahol a program elhelyezkedik. („hordozható lesz” a program)
b) A fájlnyitás
A reset eljárás segítségével csak létező állomány nyitható meg. A nyitás után az EOF függvény true értéke jelzi, ha a fájl üres. A Reset az aktuális fájlpozíciót a fájl elejére állítja (a művelet már megnyitott állományon is elvégezhető).
A rewrite eljárás új állományt hoz létre, vagy a már meglévő fájlt újraírja, így annak teljes tartalma elvész. Az állomány elejére állítja az aktuális fájlpozíciót.
Az append eljárás létező szöveges állományt nyit meg hozzáírásra. Az aktuális fájlpozíciót a fájl végére állítja.
Szöveges állományok esetén mindhárom fájlnyitó eljárás egy 128 bájtos adatátviteli puffert rendel az állományhoz. A fájlműveletek tovább gyorsíthatók, ha az alapértelmezési szövegpuffer helyett egy nagyobb méretűt jelölünk ki. Ezt a SetTextBuf eljárás hívásával, az állomány megnyitása előtt hajthatjuk végre. Ajánlott a pufferméretet 2 hatványának választani.
c) Írás és olvasás
Ha írásra nyitottuk meg a fájlt, akkor a Write és a Writeln eljárásokkal végezhetjük a beírást. A különbség, hogy a writeln eljárás sorvége jeleket is ír a fájlba.
A szöveges állományba történő írás esetében a karakterek először az adatátviteli pufferbe kerülnek, és csak a puffer kiürítésekor kerülnek ki a fájlba. Ennek ürítése: Flush(fájlváltozó). A Write, Writeln, Closefile automatikusan ürítik a puffert.
Ha olvasásra nyitottuk meg, akkor a Read és a Readln használható. A Read karakterenként olvas be, az aktuális fájlpozíció a következő karakter előtt lesz. A Readln sorokat olvas, az aktuális fájlpozíció a következő sor eleje lesz.
Módja: read(fájlváltozó, változólista) {A második paraméter, amibe beolvasunk}
d) A fájl lezárása
A CloseFile eljárás frissíti az állományt, így az utoljára végrehajtott műveletek eredménye is megjelenik az állományban.
Az állomány lezárása után is megmarad a kapcsolat a fájlnév és a fájlváltozó között, így ha a programban újra meg kell nyitni egy már lezárt állományt, akkor nincs szükség újabb AssignFile hívására.
A Delphi programból kilépve
Előnyei: Platform-független, nyelv-független, ember számára olvasható, rögzítetlen struktúrájú.
Hátrányai: nem hatékony tárolás (a számokat karakteres formában tárolja, míg a típusos fájl bináris formában)
e) Szövegfájl tartalmának kiolvasása
Var i: textfile;
St: string;
Assignfile(t, ’adat.txt’);
Reset(t);
While not eof(t) do Readln(t,st); {teljes sort olvas}
f) Szövegfájl sorainak megszámlálása
Db:=0;
While not eof(t) do db:=db+1;
g) Tömb tartalmának kiírása szövegfájlba
Var t: textfile;
A: array[1..10] of rec;
I: integer;
Rewrite(f);
For i:=1 to 10 do writeln(t, A[i].nev, A[i].cím);
h) Törlés szövegfájlból
Amit nem szeretnénk törölni, átmásoljuk egy típusos fájlba, majd onnan visszaírjuk a kiürített szövegfájlba.
While not eof(t) do begin
Readln(t,str,i,j);
Rec.x:=i;
Rec.y:=j;
Rec.szoveg:=str;
Write(f,rec);
End;
i) Karakterenként olvasás
Karakterenként olvassuk a fájlt, amíg egy adott elválasztójelhez nem érünk.
While ch<> ’,’ do begin
Read(t,ch);
Str:=str+ch;
End;
j) Elemekre darabolás sztringműveletekkel
db:=0;
while not eof(t) do begin
db:=db+1;
readln(t,sor);
tomb[db].eloado:=copy(sor,1,pos('#',sor)-1);
delete(sor,1,pos('#',sor));
tomb[db].albumcim:=copy(sor,1,pos('#',sor)-1);
delete(sor,1,pos('#',sor));
tomb[db].ar:=strtoint(sor);
delete(sor,1,length(sor));
delete(sor,1,pos('#',sor)+1);
end;