[Pascal – TUT] Bài 10: Tệp trong pascal – Kiểu file
1 Khái niệm về tệp:
[qads]
Type Arr = array[1..100] of integer; {dinh nghia mang Arr} TArr = FILE of Arr; {dinh nghia tep TArr co cac phan tu la mang Arr} TStr = FILE of String[50]; {tep TStr co cac phan tu la chuoi co do dai 50 ky tu} SinhVien = Record Msv, Hoten : String[50]; Diem : real; end; TSv = FILE of SinhVien; {tep TSv gom cac phan tu la kieu SinhVien} Var T1 : TArr; T2 : TStr; T3 : TSv;
- Định nghĩa trực tiếp biến kiểu tệp trong phần khai báo biến
Var T4 : FILE of array[1..100] of real; T5 : FILE of SinhVien;
1. Nhập xuất với tệp văn bản
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ó.
Trước khi thao tác với tệp chúng ta cần sử dụng thủ tục assign(bientep, tentep). Thủ tục này nhằm mục đích gán một tập tin trên đĩa (tentep) cho Tên biến tệp trong RAM (bientep).
- Mở tệp mới để ghi:
Assign(bientep, tentep); Rewrite(bientep);
Thủ tục Rewrite tạo một tập tin trên đĩa có tên đã gán cho Tên biến File bằng lệnh gán Assign đồng thời mở tập tin đó ra để truy xuất dữ liệu.Khi mở tập tin bằng lệnh Rewrite nếu trên đĩa đã có tập tin trùng với tên bạn đặt thì tập tin trên đĩa sẽ bị xoá thay vào đó là một tập tin trống mà bạn đã gán tên cho Tên biến File. Nên bạn cần cẩn thận khi mở tập tin bằng lệnh Rewrite.
- Mở tệp đã có để ghi thêm:
Assign(bientep, tentep); Append(bientep);
- Mở tệp để đọc dữ liệu:
Assign(bientep, tentep); Reset(bientep);
Chú ý: Khi mở một tập tin bằng lệnh Reset nếu tập tin không có trên đĩa sẽ gây lỗi.
CLOSE(bientep);
Việc xuất nhập dữ liệu trên biến File có kiểu chỉ được thực hiện như sau:
– Ðọc dữ liệu từ tập tin dùng thủ tục Readln(bientep,bien);
– Ghi dữ liệu vào đĩa: dùng thủ tục Writeln(bientep,bien);
Ví dụ:
uses crt; var t : Text; str : string; BEGIN clrscr; assign(t, 'inputText.txt'); {gan ten bien tep cho tep} rewrite(t); {mo tep de ghi du lieu} writeln(t, 'nguyenvanquan'); writeln(t, '7826'); reset(t); {mo tep de doc du lieu} writeln('Data of file inputText.txt:'); {trong khi con tro tep chua den cuoi tep thi cu doc} while not eof(t) do begin readln(t, str); writeln(str); end; append(t); {mo tep de ghi them du lieu} writeln(t, 'test'); close(t); reset(t); writeln; writeln('Data of file inputText.txt after change:'); {trong khi con tro tep chua den cuoi tep thi cu doc} while not eof(t) do begin readln(t, str); writeln(str); end; close(t); {dong tep} readln; END.
2. Tệp có kiểu
Như chúng ta đã biết khi nhập xuất file có kiểu text gây ra nhiều khó khăn khi phải ghi dữ liệu như khi đọc, ghi dữ liệu của 1 sinh viên phải làm rất phức tạp. Chúng ta có thể xử lý đơn giản hơn với tệp có kiểu.
Đọc và ghi :
– Ghi lên tệp: Write(bientep,bien1,bien2,…); với 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.
Truy nhập vào phần tử thứ i của 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.
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ụ:
uses crt; Type SinhVien = Record MSv, Hoten : String; Diem : real; end; Var TSv : FILE of SinhVien; sv : SinhVien; i : integer; BEGIN clrscr; assign(TSv, 'SV.dat'); rewrite(TSv); for i:= 1 to 3 do {ghi du lieu 3 sinh vien vao tep} begin {nhap du lieu} write('Nhap ma sinh vien thu ', i, ' : '); readln(sv.MSv); write(' Nhap ten sinh vien: '); readln(sv.Hoten); write(' Nhap diem cua sinh vien: '); readln(sv.diem); {ghi du lieu vao tep} write(TSv, sv); end; close(TSv); reset(TSv); {mo tep de doc} writeln; writeln('Thong tin sinh vien thu 2 trong tep:'); seek(TSv, 2); read(TSv, sv); writeln('MSV: ', sv.MSv); writeln('Ho ten: ', sv.Hoten); writeln('Diem: ', sv.diem:3:2); close(TSv); readln; END.
Khi các bạn mở tệp SV.dat ra thì sẽ không thể thấy thông tin như mong muốn vì nó được ghi dưới dạng nhị phân chứ không phải text nhưng thông tin của nó chứ thì vẫn chính xác.
Bài viết có tham khảo tại:
codepascal.blogspot.com
z15.invisionfree.com
Anh Quân ơi cho em hỏi:Làm sao để xóa một phần dữ liệu của file?
Thực ra mình cũng chưa nghĩ ra và chưa thử làm nhưng bạn có thể làm bằng cách đọc file, sau đó ghi lại file những gì cần thiết.
Dạ cảm ơn anh ạ!
Cảm ơn anh về bài blog trên
Nhưng em đang là học sinh lớp 8 và chuẩn bị đi thi giải Tin học ko chuyên nên anh có thể cho em biết cho hàm nào về tệp và dễ hiểu và đơn giản hơn không ạ
Tat ca anh biet day roi nhe.
Tệp inp vs out khác nhau chỗ nào vậy anh
inp là tệp input (đầu vào)
out là tệp ouput (đầu ra)
Dữ liệu trong tệp có bị xóa khi thoát khỏi chương trình không vậy anh
Không bị xóa đâu nhé.
cho e hỏi tệp không kiểu khai báo thế nào vậy?
Mình đã hướng dẫn bên trên rồi nhé.
em muốn xuất theo thứ tự từ 1 đến 3 , mỗi thí sinh là 1 hàng;
code của em là :……
reset(tSV);
for i=1 to i =3 do
begin
write(sv.Msv,’ ‘);
write(sv.Hoten,’ ‘);
writeln(sv.Diem);
end;
close(tSV);
readln;
mà sao nó chỉ xuất ra thí sinh cuối cùng à ?
Vì e chưa có lệnh ghi vào file thì phải.
program Taptin;
uses crt;
type
thisinh = record
Hoten:string[10];
Namsinh:integer;
Diemthi: real;
Ketqua:(trungbinh,kha,kem,gioi);
end;
var MTS : file of thisinh;
i:integer;
sv:thisinh;
begin
clrscr;
assign(MTS,’Thisinh.dat’);
rewrite(MTS);
for i:=1 to 2 do
begin
write(‘nhap ten sinh vien thu ‘,i,’:’);
readln(sv.Hoten);
write(‘nhap nam sinh:’);
readln(sv.Namsinh);
write(‘nhap diem thi:’);
readln(sv.Diemthi);
write(‘nhap ket qua:’);
readln(sv.Ketqua);
write(MTS,sv);
end;
close(MTS);
reset(MTS);
writeln;
writeln;
for i:=1 to 2 do
begin
write(sv.Hoten,’ ‘);
write(sv.Namsinh,’ ‘);
write(sv.Diemthi:3:2,’ ‘);
writeln(sv.Ketqua);
end;
close(MTS);
readln;
end.
Code của e đây ạ . a xem dùm e với
sao lại xóa cmt ạ ? e chỉ thắc mắc về cách xuất tệp theo thứ tự mà ??
Căn bản em đưa code lên, chả nói gì, a cũng chả biết xử lý thế nào. Ít cũng phải mô tả xem nó thế nào, làm về cái gì, mắc lỗi ra sao chứ.
cho em hỏi sao chổ
seek(TSv, 2);
read(TSv, sv);
máy em nếu để 0 nó tìm record 1; Nếu 1 nó tìm record 2. Tức là nó tăng lên 1 chứ không như trong bài của anh tìm 2 nó ra 2.
Tiện thể cho em hỏi luôn. Làm sao để có phần Code có định dạng như phần ví dụ của anh vậy ạ?
Em muốn tham khảo để làm 1 trang web ạ.
Mình dùng wordpress làm web, nó có plugin rồi.
Bạn xem bài này: https://cachhoc.net/2014/06/18/wordpess-hien-thi-code-tren-wordpress-voi-syntax-highlighted-posting-source-code-on-wordpress-with-syntax-highlighted/
Mình dùng wordpress làm web, nó có plugin rồi.
Bạn xem bài này: https://cachhoc.net/2014/06/18/wordpess-hien-thi-code-tren-wordpress-voi-syntax-highlighted-posting-source-code-on-wordpress-with-syntax-highlighted/
A ơi, e làm mãi mà ko ra đk kết quả ạ:
Program Khoang_Cach;
Var d:real;
f: text;
x,y: integer;
Begin
Assign(f,’ TRAI.TXT’);
Reset(f);
While not eof(f) do
Begin
Read(f,x,y);
d:= sqrt(x*x+y*y);
Writeln(‘ Khoang Cach:’, d:10:2)
End;
Close(f)
Readln;
End.
Mong ad giúp vs tìm e lỗi và sửa lại giúp e
Cái này phải xem trong file bạn có dữ liệu chưa. Thử debug xem nó thế nào?
Close(f) thiếu dấu ;
muốn mở tiệp ra và ghi giá trị vào cuối cùng của biến có kiểu thì sao? Không sử dụng đc Append?
thế làm sao để đọc dữ liệu văn bản trong tệp
ở trên anh mới hướng dẫn đọc dữ liệu số thôi
Có đọc text ở trên rồi mà 🙂
Em phải xem tệp TRAI.TXT có nhập dữ liệu vào chưa? Đúng quy cách không?
cho e hỏi: BTVN của e như sau: tính 1/1+2 +1/2+3 + 1/3+4 +…+1/(n-1)+n, e viết chương trình như sau:
program tinh;
uses crt;
var i,n: integer;
S: real;
begin
clrscr;
write(‘Nhap so n: ‘); Readln(n);
S:=0;
fori:=1 to n do if i mod 2 0 then S:= S+1/((i-1)+i);
writeln(‘ Tong la: ‘,S+2018 :5:0);
readln
end.
e viết chương trình như thế này nhưng khi chạy nhập số nào nó cũng ra kết quả là 2019 hết
xem giúp e coi e sai chỗ nào v ạ?
giúp e với
tại sao lại cố định 2018 ở đầu ra?