Lp trình căn bn
Chương 10
KIU TP TIN
Hc xong chương này, sinh viên s nm rõ các vn đề sau:
Mt s khái nim v tp tin?
Các bước thao tác vi tp tin.
Mt s hàm truy xut tp tin văn bn.
Mt s hàm truy xut tp tin nh phân.
I. MT S KHÁI NIM V TP TIN
Đối vi các kiu d liu ta đã biết như kiu s, kiu mng, kiu cu trúc thì d
liu được t chc trong b nh trong (RAM) ca máy tính nên khi kết thúc vic thc
hin chương trình thì d liu cũng b mt; khi cn chúng ta bt buc phi nhp li t
bàn phím. Điu đó va mt thi gian va không gii quyết được các bài toán vi s
liu ln. Để gii quyết vn đề, người ta đưa ra kiu tp tin (file) cho phép lưu tr d
liu b nh ngoài (đĩa). Khi kết thúc chương trình thì d liu vn còn do đó chúng ta
có th s dng nhiu ln. Mt đặc đim khác ca kiu tp tin là kích thưc ln vi s
lượng các phn t không hn chế (ch b hn chế bi dung lượng ca b nh ngoài).
Có 3 loi d liu kiu tp tin:
o Tp tin văn bn (Text File): là loi tp tin dùng để ghi các ký t lên đĩa, các
ký t này được lưu tr dưới dng mã Ascii. Đim đặc bit là d liu ca tp tin được
lưu tr thành các dòng, mi dòng được kết thúc bng ký t xung dòng (new line), ký
hiu ‘\n’; ký t này là s kết hp ca 2 ký t CR (Carriage Return - V đầu dòng, mã
Ascii là 13) và LF (Line Feed - Xung dòng, mã Ascii là 10). Mi tp tin được kết
thúc bi ký t EOF (End Of File) có mã Ascii là 26 (xác định bi t hp phím Ctrl +
Z).
Tp tin văn bn ch có th truy xut theo kiu tun t.
o Tp tin định kiu (Typed File): là loi tp tin bao gm nhiu phn t
cùng kiu: char, int, long, cu trúc… và được lưu tr trên đĩa dưi dng mt chui các
byte liên tc.
o Tp tin không định kiu (Untyped File): là loi tp tin mà d liu ca chúng
gm các cu trúc d liu mà người ta không quan tâm đến ni dung hoc kiu ca nó,
ch lưu ý đến các yếu t vt lý ca tp tin như độ ln và các yếu t tác động lên tp tin
mà thôi.
Biến tp tin: là mt biến thuc kiu d liu tp tin dùng để đại din cho mt
tp tin. D liu cha trong mt tp tin được truy xut qua các thao tác vi thông s
biến tp tin đại din cho tp tin đó.
Con tr tp tin: Khi mt tp tin được m ra để làm vic, ti mi thi đim, s
có mt v trí ca tp tin mà ti đó vic đọc/ghi thông tin s xy ra. Người ta hình dung
có mt con tr đang ch đến v trí đó và đặt tên nó là con tr tp tin.
Trang 105
Lp trình căn bn
Sau khi đọc/ghi xong d liu, con tr s chuyn dch thêm mt phn t v phía
cui tp tin. Sau phn t d liu cui cùng ca tp tin là du kết thúc tp tin EOF (End
Of File).
II. CÁC THAO TÁC TRÊN TP TIN
Mun thao tác trên tp tin, ta phi ln lượt làm theo các bước:
o Khai báo biến tp tin.
o M tp tin bng hàm fopen().
o Thc hin các thao tác x lý d liu ca tp tin bng các hàm đọc/ghi d liu.
o Đóng tp tin bng hàm fclose().
đây, ta thao tác vi tp tin nh các hàm được định nghĩa trong thư vin stdio.h.
II.1. Khai báo biến tp tin
Cú pháp: FILE <Danh sách các biến con tr>
Các biến trong danh sách phi là các con trđược phân cách bi du phy(,).
Ví d: FILE *f1,*f2;
II.2. M tp tin
Cú pháp: FILE *fopen(char *Path, const char *Mode)
Trong đó:
- Path: chui ch đường dn đến tp tin trên đĩa.
- Type: chui xác định cách thc mà tp tin s m. Các giá tr có th ca Mode:
Chế độ Ý nghĩa
r M tp tin văn bn để đọc
w To ra tp tin văn bn mi để ghi
a Ni vào tp tin văn bn
rb M tp tin nh phân để đọc
wb To ra tp tin nh phân để ghi
ab Ni vào tp tin nh phân
r+ M mt tp tin văn bn để đọc/ghi
w+ To ra tp tin văn bn để đọc ghi
a+ Ni vào hay to mi tp tin văn bn để đọc/ghi
r+b M ra tp tin nh phân để đọc/ghi
w+b To ra tp tin nh phân để đọc/ghi
a+b Ni vào hay to mi tp tin nh phân
- Hàm fopen tr v mt con tr tp tin. Chương trình ca ta không th thay đổi
giá tr ca con tr này. Nếu có mt li xut hin trong khi m tp tin thì hàm này tr v
con tr NULL.
Ví d: M mt tp tin tên TEST.txt để ghi.
FILE *f;
f = fopen(“TEST.txt”, “w”);
if (f!=NULL)
{
/* Các câu lnh để thao tác vi tp tin*/
Trang 106
Lp trình căn bn
/* Đóng tp tin*/
}
Trong ví d trên, ta có s dng câu lnh kim tra điu kin để xác định
m tp tin có thành công hay không?.
Nếu m tp tin để ghi, nếu tp tin đã tn ti ri thì tp tin s b xóa và
mt tp tin mi được to ra. Nếu ta mun ghi ni d liu, ta phi s dng chế
độ “a”. Khi m vi chế độ đọc, tp tin phi tn ti ri, nếu không mt li s
xut hin.
II.3. Đóng tp tin
Hàm fclose() được dùng để đóng tp tin được m bi hàm fopen(). Hàm này s
ghi d liu còn li trong vùng đệm vào tp tin và đóng li tp tin.
Cú pháp: int fclose(FILE *f)
Trong đó f là con tr tp tin được m bi hàm fopen(). Giá tr tr v ca hàm là
0 báo rng vic đóng tp tin thành công. Hàm tr v EOF nếu có xut hin li.
Ngoài ra, ta còn có th s dng hàm fcloseall() để đóng tt c các tp tin li.
pháp: int fcloseall()
Kết qu tr v ca hàm là tng s các tp tin đưc đóng li. Nếu không thành
công, kết qu tr v là EOF.
II.4. Kim tra đến cui tp tin hay chưa?
Cú pháp: int feof(FILE *f)
Ý nghĩa: Kim tra xem đã chm ti cui tp tin hay chưa và tr v EOF nếu
cui tp tin được chm ti, ngược li tr v 0.
II.5 Di chuyn con tr tp tin v đầu tp tin - Hàm rewind()
Khi ta đang thao tác mt tp tin đang m, con tr tp tin luôn di chuyn v phía
cui tp tin. Mun cho con tr quay v đầu tp tin như khi m nó, ta s dng hàm
rewind().
Cú pháp: void rewind(FILE *f)
III. TRUY CP TP TIN VĂN BN
III.1. Ghi d liu lên tp tin văn bn
III.1.1 Hàm putc()
Hàm này được dùng để ghi mt ký t lên mt tp tin văn bn đang được m để
làm vic.
Cú pháp: int putc(int c, FILE *f)
Trong đó, tham s c cha mã Ascii ca mt ký t nào đó. Mã này được ghi lên
tp tin liên kết vi con tr f. Hàm này tr v EOF nếu gp li.
III.1.2 Hàm fputs()
Hàm này dùng để ghi mt chui ký t cha trong vùng đệm lên tp tin văn bn.
Cú pháp: int puts(const char *buffer, FILE *f)
Trang 107
Lp trình căn bn
Trong đó, buffer là con tr có kiu char ch đến v trí đầu tiên ca chui ký t
được ghi vào. Hàm này tr v giá tr 0 nếu buffer cha chui rng và tr v EOF nếu
gp li.
III.1.3 Hàm fprintf()
Hàm này dùng để ghi d liu có định dng lên tp tin văn bn.
Cú pháp: fprintf(FILE *f, const char *format, varexpr)
Trong đó: format: chui định dng (ging vi các định dng ca hàm
printf()), varexpr: danh sách các biu thc, mi biu thc cách nhau du phy (,).
Định dng Ý nghĩa
%d Ghi s nguyên
%[.s ch s thp phân] f Ghi s thc có <s ch s thp phân> theo quy tc làm
tròn s.
%o Ghi s nguyên h bát phân
%x Ghi s nguyên h thp lc phân
%c Ghi mt ký t
%s Ghi chui ký t
%e hoc %E hoc %g
hoc %G
Ghi s thc dng khoa hc (nhân 10 mũ x)
d: Viết chương trình ghi chui ký t lên tp tin văn bn D:\\Baihat.txt
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f;
clrscr();
f=fopen("D:\\Baihat.txt","r+");
if (f!=NULL)
{
fputs("Em oi Ha Noi pho.\n",f);
fputs("Ta con em, mui hoang lan; ta con em, mui hoa sua.",f);
fclose(f);
}
getch();
return 0;
}
Ni dung tp tin Baihat.txt khi được m bng trình son tho văn bn Notepad.
Trang 108
Lp trình căn bn
III.2. Đọc d liu t tp tin văn bn
III.2.1 Hàm getc()
Hàm này dùng để đọc d liu t tp tin văn bn đang được m để làm vic.
Cú pháp: int getc(FILE *f)
Hàm này tr v mã Ascii ca mt ký t nào đó (k c EOF) trong tp tin liên
kết vi con tr f.
III.2.2 Hàm fgets()
pháp: char *fgets(char *buffer, int n, FILE *f)
Hàm này được dùng để đọc mt chui ký t t tp tin văn bn đang được m ra
và liên kết vi con tr f cho đến khi đọc đủ n ký t hoc gp ký t xung dòng ‘\n’ (ký
t này cũng được đưa vào chui kết qu) hay gp ký t kết thúc EOF (ký t này không
được đưa vào chui kết qu).
Trong đó:
- buffer (vùng đệm): con tr có kiu char ch đến cùng nh đủ ln cha các ký
t nhn được.
- n: giá tr nguyên ch độ dài ln nht ca chui ký t nhn được.
- f: con tr liên kết vi mt tp tin nào đó.
- Ký t NULL (‘\0’) t động được thêm vào cui chui kết qu lưu trong vùng
đêm.
- Hàm tr v địa ch đầu tiên ca vùng đệm khi không gp li và chưa gp ký t
kết thúc EOF. Ngược li, hàm tr v giá tr NULL.
III.2.3 Hàm fscanf()
Hàm này dùng để đọc d liu t tp tin văn bn vào danh sách các biến theo
định dng.
Cú pháp: fscanf(FILE *f, const char *format, varlist)
Trong đó: format: chui định dng (ging hàm scanf()); varlist: danh sách các
biến mi biến cách nhau du phy (,).
Ví d: Viết chương trình chép tp tin D:\Baihat.txt trên sang tp tin
D:\Baica.txt.
#include<stdio.h>
#include<conio.h>
int main()
{
FILE *f1,*f2;
clrscr();
f1=fopen("D:\\Baihat.txt","rt");
f2=fopen("D:\\Baica.txt","wt");
if (f1!=NULL && f2!=NULL)
{
int ch=fgetc(f1);
while (! feof(f1))
{
fputc(ch,f2);
ch=fgetc(f1);
}
Trang 109