Chuyên đề : KIỂU DỮ LIỆU TỆP
1 Khái niệm về tệp:
Tệp là một dãy các phần tử cùng kiểu được sắp xếp một cách tuần tự.
Tệp dữ liệu được lưu trữ ở bộ nhớ ngoài dưới một tên nào đó.
Tệp tập hợp
trong nó một số phần tử dữ liệu có cùng cấu trúc giống như mảng nhưng khác mảng
là số phần tử của tệp chưa được xác định.
Trong Pascal có
3 loại tệp được sử dụng là:
1. Tệp có kiểu:
Tệp có kiểu là
tệp mà các phần tử của nó có cùng độ dài và cùng kiểu dữ liệu.
2 Tệp văn bản:
Dùng để lưu trữ
dữ liệu dưới dạng các ký tự của bảng mã ASCII, các ký tự này được lưu thành
từng dòng, độ dài các dòng có thể khác nhau. Ví dụ 2008 (kiểu word) khi ghi vào
tệp văn bản cần 4 Byte (không phải 2 Byte).
3 Tệp không kiểu:
Tệp không kiểu
là một loại tệp không cần quan tâm đến kiểu dữ liệu ghi trên tệp. Dữ liệu ghi
vào tệp không cần chuyển đổi.
Tác dụng lớn nhất của kiểu dữ liệu tệp là ta
có thể lưu trữ các dữ liệu nhập vào từ bàn phím và các kết quả xử lý trong bộ
nhớ RAM ra tệp để dùng nhiều lần.
1.
Khai báo:
* Định nghĩa kiểu tệp với từ khóa FILE OF
trong phần mô tả kiểu sau từ TYPE, tiếp theo là khai báo biến tệp trong phần
khai báo biến.
Ví dụ 2.6:
Type
MSN=Array[1..100] of integer; {định nghĩa
mảng 100 số nguyên}
TSN= File of MSN; {định nghĩa tệp TSN có
các phần tử là mảng số nguyên}
TCV=File of String[80]; {định nghĩa tệp
TCV có các phần tử là các chuỗi có độ dài 80 ký tự.
Bangdiem= Record
……
End;
TBD= File of Bangdiem;
Var:
Tep1: TSN;
Tep2: TCV;
Tep3: TBD;
*
Định nghĩa trực tiếp biến kiểu tệp trong phần khai báo biến
Var
Tep4:File of
Array[1..5] of String[80];
Tep5: File of
Bangdiem;
1.
Truy nhập vào tệp:
Turbo Pascal có thể xử lý 2 loại tệp là :
Tệp truy nhập tuần tự và tệp truy nhập trực tiếp.
* Tệp truy nhập tuần tự: để truy nhập vào
một phần tử nào đó, ta bắt buộc phải đi qua các phần tử trước đó. Nếu muốn thêm
các phần tử vào tệp thì có thể thêm vào cuối tệp.
* Tệp truy nhập trực tiếp: là tệp có thể
truy nhập vào phần tử bất kỳ trong tệp. Muốn truy nhập trực tiếp phải dùng thủ
tục Seek (số hiệu phần tử).
*
Mở tệp:
Để mở một tệp chuẩn bị lưu trữ dữ liệu, ta
sử dụng 2 thủ tục chuẩn sau đây:
ASSIGN(biến tệp,
tên tệp);
REWRITE(biến tệp);
Trong đó:
Biến tệp: là tên
biến tệp đã khai báo sau từ khóa VAR
Tên tệp: Là tên do
ta chọn để ghi dữ liệu vào đĩa.
Ví dụ : ASSIGN(f, ‘a:\baitap.txt’);
REWRITE(f); {khởi
tạo tệp rỗng}
Sau 2 thủ tục trên, để tiến hành ghi dữ
liệu vào tệp ta lại dùng thủ tục WRITE(…):
Cách viết:
WRITE(biến tệp,
các giá trị cần ghi vào tệp);
Cuối cùng, ta phải đóng tệp bằng thủ tục:
CLOSE(biến tệp);
2 Tệp văn bản:
a.
Khai báo tệp văn bản:
Tệp
văn bản được khai báo trực tiếp trong phần khai báo biến:
Var Bientep:Text;
b.
Truy nhập vào tệp:
Truy
nhập vào tệp được hiểu là nhập dữ liệu vào tệp, ghi lại dữ liệu trên thiết bị
nhớ ngoài, đọc dữ liệu đó ra màn hình hoặc máy in và xử lý nó.
*
Mở tệp mới để ghi:
Assign(bientep, tentep);
Rewrite(bientep);
*
Mở tệp đã có để ghi thêm:
Assign(bientep, tentep);
Append(bientep);
*
Mở tệp để đọc dữ liệu:
Assign(bientep, tentep);
Reset(bientep);
c. Ghi dữ liệu vào tệp:
Sau khi đã mở tệp chúng ta có thể dùng thủ
tục Write hoặc Writeln để ghi dữ liệu vào tệp.
Ví dụ 2.7:
Var T1:Text;
Begin
Assign(T1,’Dulieu.dat’);
Rewrite(T1);
Writeln(T1,’Tep
van ban’);
Write(T1,123);
Write(T1,’
’,123.45);
Writeln(T1);
Close(T1);
End.
Dữ liệu ghi vào tệp như sau:
Tep van ban
123
1.234500000E+02
Dòng trống
d. Đọc dữ liệu từ tệp văn bản:
Sau khi tiến hành mở tệp, con trỏ
tệp sẽ được đặt tại dòng đầu.Ta dùng thủ tục Read hoặc Readln để đọc dữ liệu từ
dòng hiện thời và gán vào biến tương ứng, viết biến đó ra màn hình hoặc máy in.
Để có thể viết toàn bộ dữ liệu từ
một tệp văn bản ra các thiết bị ngoài thì, thì các lệnh đọc viết phải được lặp
đi lặp lại từ dòng 1 đến dòng cuối cùng, nghĩa là phải sử dụng một trong 2 vòng
lặp:
While not
eof(Bientep) do
Begin
Readln(Bientep, Dong); {biến Dong phải được
khai báo trước, kiểu String}
Write(Dong);
End;
Hoặc:
For i:=1 to
filesize(Bientep) do
Begin
Readln(Bientep,Dong);
Write(Dong);
End;
Lưu ý: Muốn lấy
lại kiểu của dữ liệu nhập vào tệp văn bản thì mỗi biến phải nhập trên một dòng.
Ví dụ 2.8:
Xây dựng một chương trình đơn giản để quản lý công chức. Dữ liệu
nhập bao gồm: Họ tên, Hệ số lương và số con. Dữ liệu xuất ra màn hình bao gồm
Họ tên, Hệ số lương, Số con và Lương tháng ( tính theo quy định của nhà nước =
heso*540000).
Chương trình đặt
ra hai khả năng lựa chọn:
1. Nếu tệp dữ liệu đã tồn tại thì nhập thêm
người
2. Nếu tệp chưa có thì mở tệp mới
Trong cả 2
trường hợp đều cho biết số người cần nhập. Dữ liệu in ra dưới dạng bảng.
Program
Quan_ly_can_bo;
Uses Crt;
Var f:Text;
hoten:String[20]; c1, heso:real; c2,i,n,socon:byte;
Ten:string[12];
Begin
Clrscr;
Write(‘cho biet ten tep’);
readln(ten);
Assign(f,ten);
Reset(f);
If IOResult=0 then
Append(f);
Else Rewrite(f);
Write(‘nhap bao nhieu nguoi’);
readln(n);
For i:=1 to n do
Begin
Write(‘Hoten’);
Readln(hoten);
Write(‘He
so’); Readln(heso);
Write(‘So
con’); Readln(socon);
Writeln(f,hoten);
Writeln(f,heso:4:2);
Writeln(f,socon);
End;
Close(f);
Assign(f,ten);
Reset(f);
Writeln(‘------------------------------------------------------‘);
Writeln (‘| Ho va ten | Hs | socon |
Luong |’);
Writeln(‘------------------------------------------------------‘)
While not eof(f) do
Begin
Readln(f,hoten);
Readln(f,heso);
Readln(f,socon);
Writeln(‘|’,ten:19,’|’,heso:4:2,’|’,socon:4,’|’,heso*540000:10:2,’|’);
End;
Readln;
End.
3 Tệp có kiểu:
a. Đọc và ghi :
- Ghi lên tệp:
Write(bientep,bien1,bien2,…);
bien1,bien2,…là các biến cùng kiểu với biến
tệp.
- Đọc tệp: Read(bientep,bien1,bien2,…);
Chú ý:
Khác với tệp văn bản, việc ghi và đọc tệp có
kiểu không sử dụng các lệnh Writeln hoặc readln nghĩa là tệp có kiểu không ghi
dữ liệu thành các dòng. Các phần tử của tệp có kiểu được ghi liên tục trong các
ô nhớ và chỉ có ký hiệu kết thúc tệp EOF.
Khi chúng ta đọc hoặc ghi xong một phần tử thì
con trỏ tệp sẽ tự động chuyển đến vị trí kế tiếp.
1. Truy nhập vào tệp: Seek(bientep,i);
i=0,1,2,…
Thủ tục seek sẽ
định vị con trỏ tại vị trí thứ i của tệp.
1. các hàm xử lý tệp:
* Filesize(bientep) cho biết số phần tử có
trong tệp
* FilePos(bientep) cho biết vị trí hiện
thời của con trỏ tệp
* Eof(Bientep) cho giá trị là True nếu con
trỏ tệp ở vị trí cuối tệp, ngược lại cho giá trị False
Ví dụ 2.9:
Tạo một tệp lấy
tên là TEPCK.DAT để vừa ghi vừa sửa dữ liệu:
Program Tep_co_kieu:
Uses crt;
Var bt:file of byte; i:byte; n:real;
Begin
Clrscr;
Assign(bt,’
TEPCK.DAT’);
Rewrite(bt);
For
i:=0 to 5 do write(bt,i); {ghi vào tệp 5 số nguyên}
Reset(bt);
Writeln(‘Du
lieu luu tru trong tep TEPCK.DAT’);
While
not eof(BT) do
Begin
Read(bt,i);
write(i:5);
End;
Writeln;
Seek(bt,3);
{định vị con trỏ tại phần tử thứ 4}
Textcolor(magenta);
Read(bt,i);
Writeln
(‘So trong tep o vi trí thu 4:’,i);
i:=33;
seek(bt,3);
write(bt,i);
seek(bt,3);
read(bt,i);
writeln(‘So
moi trong tep o vi tri 4:,i);
writeln(‘vi
tri hien thoi cua con tro:’, filepos(bt));
readln;
close(bt);
end.
4 Tệp không kiểu:
a. Khai báo biến tệp:
Var Bientep:File;
b. Mở tệp để
ghi-đọc:
* Mở tệp mới để ghi:
Assign(bientep, tentep);
Rewrite(bientep, n);
* Mở tệp để đọc dữ liệu:
Assign(bientep, tentep);
Reset(bientep, n);
Với n là độ lớn tính theo Byte.
c. Đọc và ghi
tệp không định kiểu:
* Đọc tệp không định kiểu:
BlockRead(bientep,biennho,i,j);
* biennho: là biến đã được khai báo cùng
kiểu với các phần tử của tệp, biến nhớ đóng vai trò vùng nhớ đệm để lưu trữ dữ
liệu đọc từ phần tử của tệp ra.
* i: là số phần tử quy định cho mỗi lần
đọc.
* j: là biến kiểu Word, dùng để ghi lại số
phần tử thực sự đã được đọc.
* Ghi tệp không
định kiểu:
BlockWrite(bientep,biennho,i);
1. Truy nhập tệp không định kiểu:
Tệp không kiểu
cũng được truy nhập như tệp có kiểu nghĩa là cũng dùng thủ tục Seek(bientep,n)
để truy nhập vào phần tử thứ n+1 của tệp.
Lưu ý là với tệp
không kiểu, mỗi lần con trỏ dịch chuyển nó sẽ dịch chuyển một số byte đúng bằng
số byte đã quy định trong lệnh Rewrite() hoặc Reset()
Ví dụ 2.10
Nhập vào tệp các
phần tử là record và sau đó viết chúng ra màn hình. Trong phần khai báo record
chọn Hoten là string[15] và Diem thuộc kiểu Real.
Program
tep_khong_kieu;
Uses Crt;
Type hs=record
Hoten:string[15];
Diem:real;
End;
Var
bt:file; k,nguoi:hs; i,j:byte;
begin
clrscr;
assign(bt,’tep0kieu.dat’);
rewrite(bt,22);
write(‘Nhap bao nhieu nguoi?’);
readln(n);
for i:=1 to n do with nguoi do
begin
write(‘ Ho va
ten:’); readln(hoten);
write(“Diem
tong:’); readln(diem);
blockwrite(bt,nguoi,1);
end;
for i:=1 to n-1 do
begin
seek(bt,i);
blockread(bt,k,1);
textcolor(red);
with k do
writeln(hoten.’ ‘,diem:5:2);
end;
ose(bt);
Readln;
End.
CodePascal sưu tầm

Simply wish to say your article is as surprising. The clarity in your post is simply great and
i can assume you are an expert on this subject. Fine with your permission allow me to
grab your RSS feed to keep updated with forthcoming post.
Thanks a million and please carry on the
gratifying work.
Feel free to visit my weblog :: how to file bankruptcy in florida
lúc 02:02 16 tháng 3, 2013
p uj?thao tác vào file sao j pạn?
lúc 21:28 28 tháng 6, 2013
p uj?thao tác vào file sao j pạn?
lúc 21:29 28 tháng 6, 2013
a du
lúc 06:59 29 tháng 5, 2014
Cho mình hỏi là làm sao để kiểm tra điều kiện của tệp?
lúc 08:50 10 tháng 7, 2014
tại sao viết lập trình không lỗi nhưng lúc in ra thì lúc nào cũng bằng 0 zậy ( trả lời đúng cho địt).
lúc 20:40 1 tháng 4, 2015
đk cái j vậy
tao ko hiểu nhập nhiều giá trị kiểu j?
vậy mà cũng đăng
lúc 21:46 27 tháng 11, 2015
rể
lúc 13:41 31 tháng 3, 2016
giải giúp em bài này đi em đang hc bồi dưỡng lớp 9 làm ts bài này bí quá nhờ các anh giúp dùm
Tổng n số nguyên
Cho dãy n số nguyên.
Yêu cầu: tìm tổng của các phần tử của từng dãy
Dữ Liệu vào file SONGUYEN.IPN gồm n dòng, mỗi dòng là 1 dãy số (mỗi dãy có tối đa 100 phần tử và mỗi phần tử có giá trị tuyệt đối không quá 30000; hai phần tử đứng kế sau nhau cách nhau ít nhất một khoảng trắng).
Kết quả: hi vào file SONGUYEN.OUT gồm n dòng mỗi dòng là 1 kết quả tìn đc tương ứng vs dữ liệu trong file input
lúc 19:15 1 tháng 12, 2016
uses crt,dos;
var
b,c:longint;i,a,x:char; doc:string; j,dem1,dem2,dem3,dem4:integer; f:text;
h,m,s,hs:word;ye,mo,d,wd:word;
begin dem1:=0;dem2:=0;dem3:=0;dem4:=0;
assign(f,'lich_su.txt');
If IOResult = 0 then
begin
Append(f); close(f);
end
Else
begin
rewrite(f); close(f);
end;
clrscr; writeln('chuong trinh da san sang');
repeat dem4:=dem4+1;
repeat
dem3:=dem3+1;
repeat dem2:=dem2+1;
repeat
i:=readkey;
if ord(i)=0 then i:=readkey;
b:=ord(i);c:=ord(j);dem1:=dem1+1;
writeln(' ki tu :{ ',chr(b),' } trong ma ASCII co STT la: ==> ',ord(i));
doc:=doc+chr(b);append(f);write(f,'[',doc,']');close(f);
until dem1=1;dem1:=0; doc:='';
append(f);write(f,'[',doc,']');close(f);
until dem2=16;dem2:=0 ;doc:='';
append(f);writeln(f,'[',doc,']');close(f);
until dem3=20;dem3:=0;doc:='';
append(f);writeln(f,'[',doc,']');close(f);
until dem4=32767;
readln;
end.
Cái này vì sao chạy lại tắt liền.
lúc 21:01 18 tháng 4, 2017
f:text;
s:string;
n:longint;
khi đọc tệp (vd read(n,s) ) nó đọc luôn cả kí tự ' '
Vd nhập(5 a) thì nó đọc là n=5 và s=' a'.
(đáng lí ra n=5 và s=a thì mới đúng,nếu cả 2 n,s cùng kiểu dữ liệu thì ko sao)
ai bít lí do tại sao s=' a' mà ko phải s='a' ko ?? (trường hợp khi n và s khác kiểu dữ liệu)
lúc 23:55 21 tháng 6, 2017
111
lúc 00:10 13 tháng 4, 2018
Trong 1 chương trình sd tệp có tên là DATA vậy ta có thể khai báo biến tệp với tên DATA đc ko ạ vì sao
lúc 21:20 14 tháng 1, 2019
ai biết tổ hợp phím mở nhanh tệp là gì ko ạ. chỉ em vơi. em cảm ơn ạ....
lúc 14:56 2 tháng 12, 2019
elazığ
bilecik
kilis
sakarya
yozgat
2CY
lúc 05:32 4 tháng 10, 2023
uşak
van
hakkari
elazığ
bingöl
211
lúc 12:42 7 tháng 10, 2023
ankara parça eşya taşıma
takipçi satın al
antalya rent a car
antalya rent a car
ankara parça eşya taşıma
0HK7OR
lúc 19:32 18 tháng 10, 2023
B92ED
referanskodunedir.com.tr
lúc 09:04 7 tháng 12, 2023
rtgrhgbtgjhgtjrhgjujj
تسليك مجاري بالقطيف
lúc 18:30 24 tháng 8, 2024
FGTHFTHY
شركة تسليك مجاري
lúc 15:41 25 tháng 8, 2024
CCF0EF219C
telegram şov sitesi
lúc 23:02 12 tháng 10, 2024
A69B71FDB6
takipçi satın al
lúc 18:44 28 tháng 12, 2024
985E6C64CD
organik takipci satin al
lúc 10:31 31 tháng 1, 2025
Đăng nhận xét