– Giạo trçnh Láûp trçnh Pascal càn bn —
–
67
—
Trang 67
BI 10. DỈỴ LIÃÛU KIÃØU TÃÛP
I. Khại niãûm:
Khi gii cạc bi toạn cọ nhiãưu v cáưn sỉí dủng nhiãưu láưn vãư sau thç ta phi täø chỉïc
dỉỵ liãûu lỉu trỉỵ trãn âéa
(dỉỵ liãûu kiãøu tãûp).
Khi kãú thục chỉång trçnh hồûc tàõt mạy thç
dỉỵ liãûu kiãøu tãûp váùn täưn tải trãn âéa.
Âënh nghéa mäüt kiãøu tãûp Tvåïi cạc pháưn tỉí cọ kiãøu
KPT (Kiãøu pháưn tỉí)
âỉåüc viãút
trong pháưn mä t kiãøu våïi tỉì khoạ
File Of
nhỉ sau:
TYPE
T = FILE OF KPT;
4
Vê dủ:
Type
FileReal = File of Real;
Date = record
Ngay: 1..31;
Thang: 1..12;
Nam: Word;
End;
NhanSu = Record
MaSo: Word;
HoDem: String[20];
Ten: String[7];
NgaySinh: Date;
Luong: Real;
End;
FnhanSu = File Of NhanSu;
Var
F1: FileReal;
F2: FNhanSu;
Ư Ghi chụ:
- Kiãøu pháưn tỉí ca tãûp cọ thãø l báút k kiãøu dỉỵ liãûu no ngoải trỉì kiãøu tãûp.
- Biãún tãûp âỉåüc khai bạo bànòg cạch sỉí dủng mäüt kiãøu tãûp â âỉåüc âënh nghéa
trỉåïc âọ hồûc khai bạo trỉûc tiãúp våïi mä t kiãøu. Vê dủ:
Var
– Giạo trçnh Láûp trçnh Pascal càn bn —
–
68
—
Trang 68
F3: File Of Char;
F4: File Of Array[1..5] Of Integer;
- Biãún tãûp l mäüt biãún thüc kiãøu dỉỵ liãûu tãûp. Mäüt biãún kiãøu tãûp âải diãûn cho mäüt
tãûp. Viãûc truy cáûp dỉỵ liãûu åí mäüt tãûp âỉåüc thãø hiãûn qua cạc thao tạc våïi thäng säú l
biãún tãûp âải diãûn.
II. Cáúu trục v phán loải tãûp:
Cạc pháưn tỉí ca mäüt
Array (Mng)
hồûc
Record
cọ thãø truy cáûp âỉåüc tu
(Random Access)
thäng qua tãn biãún, chè säú hồûc tãn trỉåìng. Cạc pháưn tỉí ca tãûp
khäng cọ tãn v viãûc truy cáûp khäng thãø tu tiãûn âỉåüc. Cạc pháưn tỉí ca tãûp âỉåüc
sàõp xãúp thnh mäüt dy v åí mäùi thåìi âiãøm chỉång trçnh chè cọ thãø truy nháûp vo
mäüt pháưn tỉí ca tãûp thäng qua giạ trë ca biãún âãûm
(Tampon Variable).
Biãún âãûm
dng âãø âạnh dáúu vë trê truy nháûp hay cn gi l cỉía säø ca tãûp. Ta cọ thãø hçnh dung
mäüt tãûp nhỉ l mäüt cün phim chủp nh. Mäùi mäüt nh l mäüt pháưn tỉí v äúng kênh l
cỉía säø âãø nhçn vo nãn tải mäùi thåìi âiãøm chè nhçn tháúy mäüt nh. Sau mäùi láưn chủp,
cỉía säø s nhçn vo nh åí vë trê kãú tiãúp.
Ta cọ thãø dng lãûnh lm dëch chuøn cỉía säø sang vë trê tiãúp theo hồûc vãư vë trê
âáưu tãûp. Mäùi tãûp âãưu âỉåüc kãút thục bàòng dáúu hiãûu âàc biãût âãø bạo hiãûu hãút tãûp, hay
gi l
EOF(F) (End Of File F).
Pascal cọ mäüt hm chøn
EOF
tr vãư giạ trë kiãøu
Boolean våïi tham säú l biãún tãûp âãø xem cỉía säø â âàût vo vë trê kãút thục tãûp âọ
chỉa. Nãúu chỉa âãún cúi tãûp thç hm
EOF
tr vãư giạ trë
False.
Viãûc phán loải tãûp dỉûa trãn viãûc bäú trê cạc pháưn tỉí ca tãûp trong bäü nhåï ngoi v
cạch truy cáûp vo tãûp:
Tãûp truy nháûp tưn tỉû
(Sequential Access)
hồûc tãûp truy nháûp
trỉûc tiãúp
(Direct Access).
Âäúi våïi tãûp truy nháûp tưn tỉû viãûc âc mäüt pháưn tỉí báút k ca tãûp phi âi qua cạc
pháưn tỉí trỉåïc âọ; mún thãm mäüt pháưn tỉí vo tãûp, phi âàût cỉía säø vo vë trê cúi
tãûp. Bäü nhåï ngoi tỉång ỉïng våïi cáúu trục ny l bàng tỉì. Tãûp truy nháûp tưn tỉû âån
gin trong viãûc tảo láûp hay xỉí l nhỉng kẹm tênh linh hoảt.
Âäúi våïi tãûp truy nháûp trỉûc tiãúp, ta cọ thãø âàût cỉía säø vo mäüt vë trê báút k ca tãûp.
Bäü nhåï ngoi âiãøn hçnh l âéa tỉì
(do âáưu tỉì khi âc cọ thãø âỉåüc âiãưu khiãøn âàût vo
mäüt chäù báút k trãn âéa tải mi thåìi âiãøm).
Tãûp truy nháûp trỉûc tiãúp chè âỉåüc âënh nghéa åí Turbo Pascal, Pascal chøn khäng
cọ.
Khi khäng nọi r l tãûp loải gç thç âọ âỉåüc màûc âënh l tãûp truy nháûp tưn tỉû.
III. Cạc thao tạc trãn tãûp:
Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn
69
Trang 69
1. Mồớ tóỷp mồùi õóứ cỏỳt dổợ lióỷu:
Chổồng trỗnh chố coù thóứ lổu laỷi dổợ lióỷu vaỡo mọỹt tóỷp sau khi ta laỡm thuớ tuỷc mồớ tóỷp.
Vióỷc mồớ tóỷp õổồỹc tióỳn haỡnh vồùi hai thuớ tuỷc õi lióửn nhau theo thổù tổỷ:
Assign(FileVar, FileName)
ReWrite(FileVar);
Trong õoù:
- FileVar:
-
FileName: tón cuớa tóỷp õỷt trong thióỳt bở nhồù ngoaỡi õổồỹc õổa vaỡo daỷng mọỹt
String (quy từc õỷt tón tổồng tổỷ hóỷ õióửu haỡnh).
Ta nón õỷt tón sao cho tón õoù phaớn
aùnh õổồỹc yù nghộa hay baớn chỏỳt, nọỹi dung cuớa tóỷp.
4 Vờ duỷ:
Assign(F1, HoSo.txt); {Gaùn tón laỡ HoSo.txt cho bióỳn F1}
ReWrite(F1); {Mồớ tóỷp HoSo.txt , tóỷp chổa coù phỏửn tổớ naỡo}
Sau khi mồớ tóỷp xong, tóỷp seợ rọựng vỗ chổa coù phỏửn tổớ naỡo, cổớa sọứ cuớa tóỷp seợ khọng
coù giaù trở xaùc õởnh vỗ noù troớ vaỡo cuọỳi tóỷp (EOF).
ệ
Ghi chuù: Khi mồớ tóỷp, nóỳu trón bọỹ nhồù ngoaỡi (cuỡng õổồỡng dỏựn) õaợ coù sụn tóỷp coù
tón truỡng vồùi tón tóỷp õổồỹc mồớ thỗ nọỹi dung cuợ seợ bở xoùa.
2. Ghi caùc giaù trở vaỡo tóỷp vồùi thuớ tuỷc Write:
Thuớ tuỷc Write seợ õỷt caùc giaù trở mồùi vaỡo tóỷp.
Cuù phaùp:
Write(FileVar, Item1, Item2, ..., ItemN);
Trong õoù:
Item1, Item2, ..., ItemN:
laỡ caùc giaù trở cỏửn ghi vaỡo tóỷp.
4 Vờ duỷ: Ta cỏửn ghi vaỡo tóỷp
ChuCai.txt
caùc giaù trở a.. z, thổỷc hióỷn nhổ sau:
...
Assign(F1, ChuCai.txt);
ReWrite(F1);
For ch:= a to z do
Write(F1, ch);
...
4
Vờ duỷ 1: Taỷo mọỹt tóỷp chổùa caùc sọỳ nguyón tổỡ 1 õóỳn 100 vồùi tón tóỷp trón õộa laỡ
Nguyen.txt
.
– Giạo trçnh Láûp trçnh Pascal càn bn —
–
70
—
Trang 70
Program TaoTepSoNguyen;
Var i: Integer;
F: File of Integer;
Begin
Assign(F,’Nguyen.txt’);
ReWrite(F);
For i:= 1 to 100 do
Write(F,i);
Close(F);
End.
Ư Ghi chụ: Mäüt tãûp cọ thãø âỉåüc dng lm tham säú ca chỉång trçnh con våïi låìi
khai bạo bàõt büc phi sau chỉỵ
Var
tỉïc l tãûp âỉåüc dng lm tham säú biãún.
3. Âc dỉỵ liãûu tỉì mäüt tãûp â cọ:
Âäúi våïi tãûp tưn tỉû, ta khäng thãø vỉìa ghi vỉìa âc âỉåüc cng mäüt lục. Sau khi ghi
dỉỵ liãûu vo tãûp v âọng lải, ta cọ thãø âc lải cạc giạ trë dỉỵ liãûu trong tãûp.
Mäüt chỉång trçnh mún sỉí dủng cạc dỉỵ liãûu â âỉåüc chỉïa trong mäüt tãp, âáưu tiãn
phi måí tãûp âọ ra âãø âc, th tủc sau nhàòm måí mäüt âc:
Cụ phạp:
Assign(FileVar, FileName);
Reset(FileVar);
Sau lãûnh
Reset
, nãúu tãûp khäng räùng thç cỉía säø tãûp bao giåì cng tr vo pháưn tỉí
âáưu tiãn ca tãûp v chỉång trçnh s sao chẹp pháưn tỉí ca tãûp âỉåüc tr sang biãún âãûm
cỉía säø. Näüi dung tãûp ny khäng bë xọa. Nãúu ta måí mäüt tãûp chỉa täưn tải trãn âéa thç
s cọ läùi.
Âãø âc dỉỵ liãûu tỉì tãûp, ta dng th tủc
READ
dảng sau:
Read(FileVar, Var1, Var2,..., VarN);
Trong âọ:
Var1, Var2,..., VarN
l cạc biãún cọ cng kiãøu thnh pháưn ca
FileVar
.
Gàûp lãûnh ny mạy s âc cạc giạ trë tải vë trê cỉía säø âang tr
(nãúu cọ)
gạn sang biãún
tỉång ỉïng cng kiãøu. Sau âọ, cỉía säø dëch chuøn sang vë trê tiãúp theo v âc giạ trë
cho biãún khạc, cỉï thãú âc cho âãún biãún
VarN. READ
chè cọ thãø âc giạ trë ca tãûp
âãø gạn giạ trë cho cạc biãún.
– Giạo trçnh Láûp trçnh Pascal càn bn —
–
71
—
Trang 71
Viãûc âc mäüt pháưn tỉí ca tãûp cáưn tha mn âiãưu kiãûn: pháưn tỉí âọ khäng phi l
pháưn tỉí cúi tãûp tỉïc l
EOF
. Do âọ, trỉåïc khi mún âc tãûp v gạn cho biãún X, cáưn
phi thỉí xem tãûp âọ â kãút thục chỉa bàòng cáu lãûnh:
If Not EOF(FileVar) Then Read(FileVar, X);
Hồûc nãúu mún âc táút c cạc pháưn tỉí ca tãûp:
While Not EOF(FileVar) Do
Begin
Read(FileVar, X);
Xỉí l biãún x nãúu cáưn;
...
End;
Thỉûc hiãûn xong ta phi âọng tãûp våïi th tủc sau:
Close(FileVar);
4
Vê dủ1: Gi sỉí â täưn tải mäüt tãûp cọ tãn l
Nguyen.txt
chỉïa cạc säú kiãøu Byte v
cọ êt nháút ba pháưn tỉí. Thỉûc hiãûn âc ra giạ trë thỉï nháút v thỉï ba ca tãûp v gạn cho
hai biãún A, B tỉång ỉïng.
Program DocSo;
Var A, B: Byte;
F: File Of Byte;
Begin
Assign(F,’Nguyen.txt’);
Reset(F);
Read(F,A); {âc mäüt pháưn tỉí thỉï nháút ca tãûp ra biãún A}
Read(F,B); {âc mäüt pháưn tỉí thỉï hai ca tãûp ra biãún B}
Read(F,B); {âc mäüt pháưn tỉí thỉï hai ca tãûp ra biãún B}
{lục ny B khäng giỉỵ giạ trë thỉï hai nỉỵa}
Close(F);
End.
Vç âáy l tãûp cọ cáúu trục tưn tỉû nãn mún âc pháưn tỉí thỉï ba ta büc phi âc
qua pháưn tỉí thỉï hai.
Ba láưn
Read(F,...)
åí trãn cọ thãø thay thãú bàòng mäüt lãûnh âc duy nháút:
Read(F,A, B, B);
– Giạo trçnh Láûp trçnh Pascal càn bn —
–
72
—
Trang 72
4
Vê dủ 2: Âc táút c cạc pháưn tỉí ca mäüt tãûp chỉïa cạc säú cọ Integer no âọ v ghi
ra mn hçnh giạ trë cạc säú âọ v cúi cng ghi ra sọ pháưn tỉí ca tãûp.
Program DocTepSo;
Uses CRT;
Var i, SoPT: Integer;
F: File Of Byte;
FileName: String;
Begin
ClrScr;
Write(‘Tep can doc la gi ? (Tep so nguyen):’);
Readln(FileName);
Assign(F, FileName);
Reset(F);
SoPT:= 0;
While Not EOF(F) Do
Begin
Read(F,i); {doc mot phan tu cua tep ra bien i}
Write(i,’ ‘);
Inc(SoPT); {dem so phan tu}
End;
Close(F);
Writeln;
Write(‘So phan tu cua tep ’,FileName,’ la ‘,SoPT);
Readln
End.
4. Tãûp truy nháûp trỉûc tiãúp:
Pascal chøn chè âënh nghéa mäüt kiãøu tãûp truy nháûp tưn tỉû. Tuy nhiãn cạc bäü
nhåï ngoi nhỉ âéa tỉì,... cọ thãø cho phẹp tênh toạn ta âäü ca mäüt pháưn tỉí báút k
trong tãûp (vç âäü di ca cạc pháưn tỉí l nhỉ nhau), do âọ cọ thãø truy nháûp trỉûc tiãúp
vo mäüt pháưn tỉí ca tãûp màûc d cáúu tảo logic ca tãûp váùn l dảng tưn tỉû. Trong
Turbo Pascal
, âãø truy nháûp trỉûc tiãúp vo pháưn tỉí ca tãûp, sỉí dủng th tủc
SEEK
.
Cụ phạp:
Seek(FileVar, No);
Giaùo trỗnh Lỏỷp trỗnh Pascal cn baớn
73
Trang 73
Trong õoù,
No
laỡ sọỳ thổù tổỷ cuớa phỏửn tổớ trong tóỷp
(phỏửn tổớ õỏửu tión cuớa tóỷp õổồỹc
õaùnh sọỳ 0)
. Gỷp thuớ tuỷc naỡy, chổồng trỗnh seợ õỷt cổớa sọứ cuớa tóỷp vaỡo phỏửn tổớ thổù
No
.
Tióỳp theo muọỳn õoỹc phỏửn tổớ õoù ra thỗ duỡng
Read
, nóỳu muọỳn õỷt giaù trở mồùi vaỡo
duỡng
Write
.
4
Vờ duỷ: Giaớ sổớ tóỷp
Nguyen.txt
trón õộa ồớ thổ muỷc hióỷn haỡnh õaợ chổùa 100 sọỳ
nguyón tổỡ
1 õóỳn 100
. Ta kióứm tra xem phỏửn tổớ thổù hai
(õóỳm tổỡ 0)
cuớa tóỷp coù giaù trở
bũng
3
khọng, nóỳu khọng thỗ sổớa laỷi bũng mọỹt giaù trở nhỏỷp tổỡ baỡn phờm.
Var
i: Byte;
F: File Of Byte;
Answer: Char;
Begin
Assign(F,Nguyen.txt);
Reset(F);
Seek(F,2); { Dat cua so tep vao vi tri thu 3}
Read(F,i);
Writeln(i = ,i);
Write(Ban muon sua lai khong ?(C/K):);
Readln(Answer);
If Answer In[c,C] Then
Begin
Seek(F,2);
Write( Ban muon sua lai bang bao nhieu ?);
Readln(i);
Write(F,i); { Thay doi gia tri cua phan tu hien tai }
End;
Close(F);
Readln
End.
5. Caùc thuớ tuỷc vaỡ haỡm xổớ lyù tóỷp cuớa Turbo Pascal:
a. Haỡm FileSize(FileVar): Haỡm cho giaù trở bióứu thở sọỳ phỏửn tổớ cuớa tóỷp
FileVar
. Haỡm
nhỏỷn giaù trở 0 khi tóỷp rọựng.
b. Haỡm FilePos(FileVar): cho bióỳt vở trờ hióỷn taỷi cuớa con tro
ớ (cổớa sọứ)
tóỷp FileVar.