Ọ
Ạ ƯƠ Ệ Ữ Ệ
NG TIN H C Đ I C Bài 8. T P D LI U.
Nguy n Thành Kiên
ậ ộ
Đ ệ ễ ỹ B môn K thu t máy tính Khoa Công ngh thông tin – HBK HN
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
2
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
3
ạ ệ
ệ
8.1. Khái ni m và phân lo i t p
ữ ệ
Khái ni m t p d li u:
ộ ậ
ợ
ệ ệ ữ ữ ệ File) là m t t p h p các d T p d li u ( ể
ớ
ượ ư
ế ị
ữ
ệ ệ li u có liên quan v i nhau và có cùng ki u ữ ệ d li u. ệ T p đ
c l u tr trên các thi
ớ t b nh
ớ ứ ề ngoài (đĩa m m, đĩa c ng, CDROM…) v i m t tên nào đó đ phân bi
ươ
ữ ữ ệ
ệ ớ t v i nhau. ể ấ
ể ệ
ộ ệ
ng ti n dùng đ c t gi
d li u
T p là ph lâu dài.
4
ạ ệ
ệ
8.1. Khái ni m và phân lo i t p
ấ ữ ệ
ủ
ả
ự
Phân lo i t p: d a theo b n ch t d li u c a
ạ ệ ạ ệ t p, chia thành 2 lo i: T p văn b n (
ệ ả text file): là t p mà các ph n t
ư ự nh ch cái, ch s , các d u
ấ ữ ộ ố ể
T p nh phân (
ị ầ ử ấ ữ ố đi u khi n ầ ệ ủ c a nó là các kí t ự ề câu, các d u cách và m t s kí t ệ binary file): là t p mà các ph n
ị
ượ ở
ị ữ ệ
N u thông tin đ
ượ ự ệ ố ử ủ c a nó là các s nh phân 0 và 1 mã hóa thông t c mã hóa b i các bit nh phân có tin. Thông tin đ ấ ố ự ố th là s nguyên, s th c, các c u trúc d li u… thì khi đó t p c mã hóa là kí t
ả
5
ậ ệ ị ể ế ị ả ệ ợ ệ ở nh phân tr thành t p văn b n. Vì v y t p văn ủ ệ ộ ườ ng h p riêng c a t p nh phân. b n là m t tr
ạ ệ
ệ
8.1. Khái ni m và phân lo i t p
ủ ệ
ổ
ứ T ch c c a t p
Tên t pệ
OS
ỏ ị Con tr v trí đang ệ ủ ệ làm vi c c a t p
ầ ử ệ Ph n t kí hi u ệ ế k t thúc t p
. . . . .
E O F
ố
ầ ử ữ ệ Ph n t d li u ầ đ u tiên
ầ ử ữ ệ Ph n t d li u cu i cùng
6
ạ ệ
ệ
8.1. Khái ni m và phân lo i t p
ỏ ệ
Con tr t p: ầ ử ủ Các ph n t ể ờ
c a m t t p t o thành m t dãy và t
ậ ộ ượ ạ i ộ c vào m t
c a t p mà thôi.
ể Con tr t p (File positon locator) là bi n đ m đ
ệ ấ ị
ộ ệ ạ ị ế ầ ử ủ ệ c a t p, đánh d u v trí ể i th i đi m xác đ nh.
ị
ầ ệ
ề
7
ỏ ệ ỗ ẽ ự ộ ị ượ ặ ố ộ ệ ạ ộ ể ỉ m t th i đi m ta ch có th truy c p đ ầ ử ủ ệ ph n t ỏ ệ ậ truy c p vào m t ph n t ờ ậ truy c p vào t p t ẽ ở ệ ỏ Khi m t p con tr t p s luôn tr vào v trí đ u ủ ệ ọ tiên c a t p. Sau m i thao tác đ c ghi trên t p, ố ị ỏ ệ ể con tr t p s t đ ng d ch chuy n v phía cu i ẽ ể ả ệ t p. Kho ng cách d ch chuy n (tính theo byte) s ệ ọ ừ ệ ằ t p ho c ghi lên t p. c đ c t b ng s byte đã đ
ạ ệ
ệ
8.1. Khái ni m và phân lo i t p
ớ ệ ủ
Quy trình thao tác v i t p: Các thao tác v i t p ph i tuân th theo trình t
ở ệ
ệ
Khai báo t pệ ể M t p đ làm vi c ậ ệ Truy nh p t p Đóng t pệ
8
ớ ệ ả ự sau:
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
9
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
10
8.2.1. Khai báo t pệ
ả
ậ ệ Trong C truy nh p t p ph i thông qua
ỏ ệ
ỏ ệ file pointer)
ượ
ư
ỏ ệ
ộ con tr t p. M t con tr t p ( c khai báo nh sau: đ FILE *tên_con_tr _t p;
Ví dụ
FILE *f1, *f2;
11
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
12
8.2.2 M t pở ệ
ế ộ ở ệ
Cú pháp: tên_con_tr _t p=fopen(tên_t p,ch _đ _m _t p);
ỏ ệ ệ ệ ế ệ ẫ ườ ng d n đ n t p.
Tên_t p là đ Ch đ m t p:
ế ộ ở ệ
ử ụ
ụ
ệ
Kí hi uệ
M c đích s d ng t p
ở ệ
ế ệ
ồ ạ
i, hàm
“r”
ể ọ ẽ ả ạ ạ
M t p đã có đ đ c, không đ i tr ng thái l
fopen() s tr l
ượ c ghi. N u t p không t n t ỗ i.
ế ệ
ớ ể
ở ệ
ồ ạ ộ
ẽ ị
ủ
ế
M t p m i đ ghi. N u t p đã t n t
i n i dung c a nó s b xóa h t.
“w”
ả
ấ ữ ệ ủ
Kí hi uệ
B n ch t d li u c a t pệ
ư ồ ạ
ế ệ
ữ ệ
ố ệ
M t p đ ghi thêm d li u vào cu i t p. N u t p ch a t n t
ẽ i, nó s
“a”
ở ệ đ
ể ớ ượ ạ c t o m i
ệ
ị T p nh phân
“b”
ể ừ ọ ừ
ư ồ ạ
ế ệ
ở ệ
ỗ
M t p đ v a đ c v a ghi. N u t p ch a t n t
ẽ i thì s báo l
i
ệ
ả
“r+”
T p văn b n
“t”
ọ ừ
ế ệ
ể ừ
ở ệ
ồ ạ
ộ
M t p đ v a đ c v a ghi. N u t p đã t n t
ẽ ị ủ i, n i dung c a nó s b
“w+”
xóa h t.ế
ớ ẽ ượ ạ
ữ ệ
ố ệ
ở ệ
ệ
M t p đ ghi thêm d li u vào cu i t p. T p m i s đ
“a+”
ế c t o n u nó 13
ư ồ ạ
ể ch a t n t
i.
ụ ở ệ
Ví d m t p
FILE *f1, *f2, *f3;
ể ọ
ệ
Đ m t p
ể
ệ
ể ở ệ c:\abc.txt đ đ c ta dùng l nh f1 = fopen("c:\\abc.txt", "rt"); ể ở ệ c:\ho_so.dat đ ghi ta dùng l nh
Đ m t p
ể ừ
ọ
ể ở ệ c:\abc.txt đ v a đ c và ghi ta
f2 = fopen("c:\\ho_so.dat", "wb"); Đ m t p dùng l nhệ f3 = fopen("c:\\abc.txt", "r+t");
14
ở ệ
ư
L u ý khi m t p
ệ
ế
ở ệ
ị
ệ
N u vi c m t p không thành công, và ể ẽ ả ề hàm fopen() s tr v giá tr NULL đ ở ệ ằ báo r ng vi c m t p không thành công.
ể
ế
ể
ẽ
ộ
ả ả ề Khi đó ta nên ki m tra k t qu tr v ế ợ ử ữ này đ có nh ng x lí thích h p, n u ự ỗ ươ không ch i và t ng trình s báo l đ ng thoát ra ngoài.
15
ở ệ
ư
L u ý khi m t p
ở ệ
Đ b t l
i phát sinh khi m t p ta có
ể ắ ỗ ể ử ụ
ẫ
th s d ng m u sau:
ợ
ở ệ
ỗ i
ng h p m t p có l
ế ộ
ở ệ
ệ
ườ // Tr FILE *f; f= fopen(tên_t p, ch _đ _m _t p)) ; if(f== NULL) {
ử
ườ
ở ệ
ợ
ng h p m t p không thành công>
ườ
ở ệ
ợ
ng h p m t p thành công
}
else // Tr
{
ở ệ
ử
}
16
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p
8.2. Các thao tác v i t p
ả
ậ ệ
ậ ệ
ị
8.2.1. Khai báo
8.2.2 M t pở ệ
8.2.3. Truy nh p t p văn b n
8.2.4. Truy nh p t p nh phân
8.2.5. Đóng t pệ
17
ậ ệ
ả
8.2.3. Truy nh p t p văn b n
ữ ệ ừ ệ
t p:
ọ
Đ c d li u t
fscanf()
fgets()
getc()
18
Hàm fscanf()
Cú pháp khai báo:
ỏ ệ
ạ
ị
ỉ
ị
int fscanf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_đ a_ch ]);
Đ c t
ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng ng v i con_tr _t p
ữ ệ
Đ nh d ng DL đ c theo khuôn d ng trong
ạ ị
ạ
ư ị ượ dãy các d li u.
ọ
ạ
ị
xâu_đ nh_d ng.
L u các giá tr đ c đ ỉ
c vào danh_sách_đ a_ch .
ư
ụ
ộ
Ví d file có n i dung nh sau:
117 a 24 x 338 h
19
ị ọ
struct
{
int n; char c;
}a[3];
for(int i=0;i<3;i++)
fscanf(fptr,”%d %c”,&a[i].n,&a[i].c);
Hàm fgets()
Cú pháp khai báo:
ự
char* fgets(char* xâu_kí_t
ỏ ệ
, int n, FILE* con_tr _t p);
Đ c t
ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng ng v i con_tr _t p
ữ ệ
Đ c d ng khi đ c đ (n1) ký t
ủ ự ặ ự dãy các d li u.
ọ ặ
ho c g p ký t
ừ
xu ng dòng.
ọ
ố
ư ự c + “\n\0” vào xâu_ký_t .
ượ
ọ
L u các giá tr đ c đ
Giá tr tr v :
ề
v xâu kí t
ỏ
ề
v con tr NULL.
20
ị ọ
ế
ự ỏ ở ự ế ỗ ả
ị ả ề n u đ c thành công hàm fgets() tr
ẽ ả
i nó s tr tr b i xâu_kí_t , n u có l
Hàm getc()
Cú pháp khai báo:
ỏ ệ
int getc(FILE* con tr t p);
Hàm getc() đ c t
ọ ừ ệ
ữ ệ ể ạ
ằ
ị ả ề ủ ị ố ượ
ộ
ự ứ
ộ
(t c là m t byte
t p m t kí t
ố
ự
ổ
d li u), sau đó chuy n đ i kí t
đó sang d ng s
ồ ấ
nguyên int (b ng cách thêm byte cao 0x00) r i l y
giá tr s nguyên thu đ
c làm giá tr tr v c a
hàm.
Giá tr tr v : n u thành công hàm getc() tr v kí
ị ả ề ế
ượ ể ạ c sau khi đã chuy n sang d ng
21
ả ề ự ọ
đ c đ
t
ế
N u không thành công hàm tr v giá tr ả ề
int.
ị EOF.
ậ ệ
ả
8.2.3. Truy nh p t p văn b n
ệ
ữ ệ
Ghi d li u lên t p:
fprintf()
fputs()
putc()
22
Hàm fprintf()
Cú pháp khai báo:
ỏ ệ
ố
ạ
ị
int fprintf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_tham_s ]);
ươ
ư ứ
Hàm fprintf() có ch c năng hoàn toàn t
ỉ ỗ
ữ ệ ữ ệ
ng là màn hình) còn fprintf() ghi d li u
ị ỉ ượ ố
c ch đ nh trong tham s
ự
ng t
ộ
nh hàm printf(), ch có m t ch khác là hàm
ẩ
ế ị
t b ra chu n (stdin,
printf() ghi d li u lên thi
thông th
lên m t t p đ
con_tr _t p.
ế ệ
ố
ệ ế ườ
ộ ệ
ỏ ệ
ả ả ề ế
ả ề ộ
ệ
23
ự
ả ề ự
K t qu tr v : n u th c hi n thành công, hàm
ữ
ị
fprintf() tr v m t giá tr nguyên là s bytes d
ệ
li u đã ghi lên t p. N u th c hi n không thành
công thì hàm fprintf() tr v giá tr ị EOF.
Hàm fputs()
Cú pháp khai báo:
ự
ỏ ệ
int fputs(char* xâu_kí_t
, FILE* con_tr _t p);
Hàm fputs() s ghi n i dung c a xâu_kí_t
ẽ ự ủ
ứ ộ
ỏ ệ
ự ộ ệ
lên t p
ớ
ng ng v i con_tr _t p, tuy nhiên nó khác v i
ự
đ ng ghi thêm kí t ớ
ở
ch nó không t
ố ươ
t
hàm puts()
xu ng dòng lên t p.
ệ
ị ả ề n u th c hi n thành công hàm
ự
ố ượ
Giá tr tr v :
ả ề
ế
cu i cùng mà nó ghi đ
ả ề
24
ỗ
ệ
ế
ự
fputs() tr v kí t
c lên
ị
ệ
t p, còn n u không thành công nó tr v giá tr
EOF.
Hàm putc()
Cú pháp khai báo:
ỏ ệ
int putc(int ch, FILE* con_tr _t p);
Hàm putc()ghi n i dung c a kí t
ủ
ch a trong bi n
ủ ứ ế ế
ự
ộ
ự ượ
đ
c ch a trong byte th p c a bi n
ứ
ấ
ỏ ệ ớ ứ int ch (kí t
ch) lên t p t ng ng v i con_tr _t p.
ẽ ả
Giá tr tr v : n u thành công hàm putc() s tr
ả
trong b ng
ế ố ứ ự
ệ ủ đã ghi lên t p. N u không
25
ệ ươ
ị ả ề ế
ể int) là s th t
ề ố
v s nguyên (ki u
ự
mã ASCII c a kí t
ả ề
thành công nó tr v giá tr ị EOF.
ộ ố
M t s thao tác khác
Hàm feof()
ỏ ệ
int feof(FILE* con_tr _t p);
ệ ế ị
Hàm feof() dùng đ ki m tra xem đã duy t đ n v
ể ể
ư trí cu i t p hay ch a.
ọ
c đ c
ố ệ
ể
ở ầ ố ữ ệ
ấ ự ượ ầ ử EOF hay
ế
Hàm ki m tra xem trong kh i d li u đ
ầ
ệ
l n th c hi n g n nh t có ph n t
vào
ị
ả ề ộ
không, n u có thì hàm feof() tr v m t giá tr
ị
ư
khác 0, còn n u ch a thì tr v giá tr 0.
26
ả ề ế
fseek(f,10,SEEK_SET);
ộ ố
M t s thao tác khác
Hàm fseek()
ỏ ệ
ị
ể
ả ầ
n có th âmể
ầ
int fseek(FILE* con_tr _t p, long int n, int v _trí_ban_đ u);
ỏ ệ ừ
ể ị
Hàm fseek() dùng đ d ch chuy n con tr t p t
ộ
ộ
ị
v _trí_ban_đ u đi m t kho ng cách có đ dài n
bytes.
Giá tr tr v : hàm fseek() s tr v giá tr 0 n u
ẽ ả ề ị ả ề ế
ư ệ ể ị ị
ả ề
Tên h ngằ
Ý nghĩa
ầ ệ
ị
ầ
V trí ban đ u là đ u t p
Giá
trị
0
SEEK_SET
ờ ủ
ệ
ị
1
SEEK_CUR
ị
ị
ầ
ỏ
V trí ban đ u là v trí hi n th i c a con tr
ệ ủ ệ
v trí làm vi c c a t p
27
ố ệ
ị
2
ầ
V trí ban đ u là cu i t p
SEEK_END
ệ ế ể ị ị
nh vi c d ch chuy n thành công, và tr v giá tr
khác 0 n u vi c d ch chuy n không thành công.
ộ ố
M t s thao tác khác
Hàm rewind()
ẽ ư
ỏ ệ
ớ
ươ
ề ầ
Hàm rewind() s đ a con tr t p v đ u
ế
ỏ ệ
ộ
ệ
t p. V i file_ptr là m t bi n con tr t p,
ớ
ươ
ng v i
ng đ
hàm rewind(file_ptr) t
fseek(file_ptr,0,SEEK_SET);
ị ả ề
Hàm rewind() không có giá tr tr v .
28
ỏ ệ
void rewind(FILE* con_tr _t p);
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p
8.2. Các thao tác v i t p
ả
ậ ệ
ậ ệ
ị
8.2.1. Khai báo
8.2.2 M t pở ệ
8.2.3. Truy nh p t p văn b n
8.2.4. Truy nh p t p nh phân
8.2.5. Đóng t pệ
29
int a[3];
fread(a,2,3,f);
double d;
fread(&d,4,1,f);
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ệ
ọ
ữ ệ
Đ c d li u trên t p
ỏ ệ
ụ
ố
ố
ế
ị
ỉ
int fread(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* con_tr _t p);
Hàm fread() đ c t
ố
ộ ọ ừ ệ ố ữ ệ
ụ (cid:0)
c s _m c
ị ớ
ế
K t qu tr v : n u vi c đ c d li u t
t p m t kh i d li u kích
ố
ố
s _byte bytes, sau đó ghi kh i
th
ỉ
d li u đó lên vùng nh có đ a ch là
ỉ
đ a_ch _bi n.
ả ả ề ế ọ t p th c
ướ
ữ ệ
ị
ế
ệ ữ ệ ừ ệ
ả ề ộ
ả ố ọ c
ố ụ
ự ượ
t p. N u th c hi n không thành công thì hàm
30
ệ
ị ự
ệ
ị
hi n thành công, hàm fread() tr v m t giá tr
nguyên là s m c (không ph i s bytes) đ c đ
ừ ệ
ế
t
ả ề
fread() tr v giá tr 0.
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ệ
ữ ệ
Ghi d li u trên t p
ỏ ệ
ụ
ố
ố
ế
ị
ỉ
int fwrite(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* );
ố ữ ệ b nh m t kh i d li u có
ị ớ ộ
ế
(cid:0) ẽ ọ ừ ộ
Hàm fwrite() s đ c t
ị
ỉ
ỉ ắ ầ
ụ ố ướ
c
ố
s _m c bytes, sau đó nó ghi kh i
đ a ch b t đ u là đ a_ch _bi n và có kích th
là s _byte
ệ
d li u này lên t p.
ả ả ề ế ự ệ
K t qu tr v : n u vi c ghi d li u lên t p th c
ố
ữ ệ
ế
ệ ệ
ữ ệ
ẽ ả ề ộ
ả ố
ố ụ
ự ệ ệ
31
ị ị
hi n thành công, hàm fwrite() s tr v m t giá tr
nguyên là s m c (không ph i s bytes) đã ghi
ế
lên t p. N u th c hi n không thành công thì hàm
ả ề
fwrite() tr v giá tr 0.
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ỏ ệ
ươ
ư ệ
ng t
ị
T
ể
D ch chuy n con tr t p
ả
ự
nh t p văn b n, ta có th dùng
ể ị
ị
ỏ ệ
ệ
ể
ị
ớ ệ
ả ư
ư
ả
ể
các hàm fseek() và rewind() đ d ch
chuy n con tr t p trên t p nh phân. Hàm
ớ ệ
fseek() khi dùng v i t p nh phân thì không
ph i l u ý nh khi dùng v i t p văn b n.
ậ
ặ
ứ
ẫ
ố
Nh n xét: Các hàm trong các c p hàm fread() – fwrite(),
fscanf() – fprintf(), fputs() – fgets(), và getc() – putc()
có ch c năng đ i ng u nhau.
32
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p
8.2. Các thao tác v i t p
ả
ậ ệ
ậ ệ
ị
8.2.1. Khai báo
8.2.2 M t pở ệ
8.2.3. Truy nh p t p văn b n
8.2.4. Truy nh p t p nh phân
8.2.5. Đóng t pệ
33
8.2.5. Đóng t pệ
Cú pháp:
ỏ ệ
int fclose(FILE* );
Hàm fclose() tr l
ả ạ ị ế
ị i giá tr 0 n u đóng thành công,
ế ệ
34
ả ề
tr v giá tr EOF n u không đóng t p thành
công.
Bài t pậ
Bài 1: Vi
ế
ươ
ng trình copy file:
t ch
ừ
ậ
bàn phím 2 xâu kí t
Nh p vào t
ồ
ủ
c a file ngu n và file đích.
ự ườ ẫ là đ ng d n
Copy n i dung c a file ngu n sang file đích.
ố ộ
ươ
ế
ng trình ghép n i n i dung 2
t ch
ủ ồ ộ
Bài 2: Vi
file
ậ
Nh p vào t
ự ườ ẫ là đ ng d n
ừ
bàn phím 2 xâu kí t
ồ
ủ
c a file ngu n và file đích
Ghép n i dung c a file ngu n vào cu i file đích.
35
ủ ộ ồ ố
Bài t pậ
ư
ề
Bài 3: M t t p văn b n tên là "thisinh.txt" l u DL v các thí sinh và
ứ
ả
ư
có t
ư
ầ
ố ượ
ỗ
ế
ể
ố
ọ
ậ
ự
ự
ấ
ộ
ề ộ
ự
đánh cho ph n th p phân, m t kí t
ầ
ộ ệ
ổ
ch c nh sau:
Dòng đ u tên l u s l
ng thí sinh.
ồ
ư
Các dòng ti p theo m i dòng l u thông tin v m t thí sinh g m
ự
có: s báo danh (10 kí t ), h và tên (30 kí t ), đi m thi (4 kí t
ớ
v i 1 kí t
cho d u "." dùng
ể
đ ngăn cách và 2 kí t
ự
ầ
ự
cho ph n nguyên).
ế
Hãy vi
ng trình
ữ ệ ừ ệ
ể
ị
t p "thisinh.txt" và hi n th ra màn hình danh sách
ươ
t ch
ọ
Đ c d li u t
các thí sinh theo quy cách:
So thu tu So bao danh Ho ten Điem thi
ị
ế
ế
ị
ố ứ ự
ị
ế
ố
ế
ể
ớ
ị
ị
ế
ế
ầ
ư
ủ ệ
ư
ớ
ọ
Trong đó s th t
chi m 3 v trí, s báo danh chi m 10 v trí, h
và tên chi m 30 v trí, đi m thi chi m 5 v trí v i 2 v trí dành cho
ầ
ậ
ph n th p phân.
ả ể
ắ
S p x p các thí sinh theo k t qu đi m thi tăng d n và l u vào
ố
ệ
t p "thisinh2.txt" v i quy cách gi ng nh quy cách c a t p
"thisinh.txt".
36
ng h p m t p không thành công>
ườ
ở ệ
ợ
ng h p m t p thành công
} else // Tr {
ở ệ
ử
}
16
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
17
ậ ệ
ả
8.2.3. Truy nh p t p văn b n
ữ ệ ừ ệ
t p:
ọ Đ c d li u t fscanf() fgets() getc()
18
Hàm fscanf() Cú pháp khai báo:
ỏ ệ
ạ
ị
ỉ
ị
int fscanf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_đ a_ch ]);
Đ c t
ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng ng v i con_tr _t p
ữ ệ
Đ nh d ng DL đ c theo khuôn d ng trong
ạ ị
ạ
ư ị ượ dãy các d li u. ọ ạ ị xâu_đ nh_d ng. L u các giá tr đ c đ ỉ c vào danh_sách_đ a_ch .
ư
ụ
ộ Ví d file có n i dung nh sau:
117 a 24 x 338 h
19
ị ọ struct { int n; char c; }a[3]; for(int i=0;i<3;i++) fscanf(fptr,”%d %c”,&a[i].n,&a[i].c);
Hàm fgets()
Cú pháp khai báo:
ự
char* fgets(char* xâu_kí_t
ỏ ệ , int n, FILE* con_tr _t p);
Đ c t
ọ ừ ệ ả ươ ỏ ệ ứ ớ t p văn b n t ng ng v i con_tr _t p
ữ ệ
Đ c d ng khi đ c đ (n1) ký t
ủ ự ặ ự dãy các d li u. ọ ặ ho c g p ký t
ừ xu ng dòng.
ọ ố ư ự c + “\n\0” vào xâu_ký_t .
ượ ọ
L u các giá tr đ c đ Giá tr tr v : ề v xâu kí t ỏ ề v con tr NULL.
20
ị ọ ế ự ỏ ở ự ế ỗ ả ị ả ề n u đ c thành công hàm fgets() tr ẽ ả i nó s tr tr b i xâu_kí_t , n u có l
Hàm getc()
Cú pháp khai báo:
ỏ ệ
int getc(FILE* con tr t p);
Hàm getc() đ c t
ọ ừ ệ
ữ ệ ể ạ
ằ
ị ả ề ủ ị ố ượ
ộ ự ứ ộ (t c là m t byte t p m t kí t ố ự ổ d li u), sau đó chuy n đ i kí t đó sang d ng s ồ ấ nguyên int (b ng cách thêm byte cao 0x00) r i l y giá tr s nguyên thu đ c làm giá tr tr v c a hàm.
Giá tr tr v : n u thành công hàm getc() tr v kí
ị ả ề ế
ượ ể ạ c sau khi đã chuy n sang d ng
21
ả ề ự ọ đ c đ t ế N u không thành công hàm tr v giá tr ả ề int. ị EOF.
ậ ệ
ả
8.2.3. Truy nh p t p văn b n
ệ
ữ ệ Ghi d li u lên t p:
fprintf() fputs() putc()
22
Hàm fprintf()
Cú pháp khai báo:
ỏ ệ
ố
ạ
ị int fprintf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_tham_s ]);
ươ
ư ứ Hàm fprintf() có ch c năng hoàn toàn t ỉ ỗ
ữ ệ ữ ệ ng là màn hình) còn fprintf() ghi d li u
ị ỉ ượ ố c ch đ nh trong tham s
ự ng t ộ nh hàm printf(), ch có m t ch khác là hàm ẩ ế ị t b ra chu n (stdin, printf() ghi d li u lên thi thông th lên m t t p đ con_tr _t p.
ế ệ
ố
ệ ế ườ ộ ệ ỏ ệ ả ả ề ế ả ề ộ ệ
23
ự ả ề ự K t qu tr v : n u th c hi n thành công, hàm ữ ị fprintf() tr v m t giá tr nguyên là s bytes d ệ li u đã ghi lên t p. N u th c hi n không thành công thì hàm fprintf() tr v giá tr ị EOF.
Hàm fputs()
Cú pháp khai báo:
ự
ỏ ệ
int fputs(char* xâu_kí_t
, FILE* con_tr _t p);
Hàm fputs() s ghi n i dung c a xâu_kí_t
ẽ ự ủ
ứ ộ ỏ ệ
ự ộ ệ lên t p ớ ng ng v i con_tr _t p, tuy nhiên nó khác v i ự đ ng ghi thêm kí t ớ ở ch nó không t
ố ươ t hàm puts() xu ng dòng lên t p.
ệ ị ả ề n u th c hi n thành công hàm
ự ố ượ
Giá tr tr v : ả ề ế
cu i cùng mà nó ghi đ ả ề
24
ỗ ệ ế ự fputs() tr v kí t c lên ị ệ t p, còn n u không thành công nó tr v giá tr EOF.
Hàm putc()
Cú pháp khai báo:
ỏ ệ int putc(int ch, FILE* con_tr _t p);
Hàm putc()ghi n i dung c a kí t
ủ
ch a trong bi n ủ ứ ế ế ự ộ ự ượ đ c ch a trong byte th p c a bi n
ứ ấ ỏ ệ ớ ứ int ch (kí t ch) lên t p t ng ng v i con_tr _t p.
ẽ ả Giá tr tr v : n u thành công hàm putc() s tr ả trong b ng ế ố ứ ự ệ ủ đã ghi lên t p. N u không
25
ệ ươ ị ả ề ế ể int) là s th t ề ố v s nguyên (ki u ự mã ASCII c a kí t ả ề thành công nó tr v giá tr ị EOF.
ộ ố
M t s thao tác khác
Hàm feof()
ỏ ệ
int feof(FILE* con_tr _t p);
ệ ế ị Hàm feof() dùng đ ki m tra xem đã duy t đ n v
ể ể ư trí cu i t p hay ch a.
ọ c đ c
ố ệ ể ở ầ ố ữ ệ ấ ự ượ ầ ử EOF hay
ế
Hàm ki m tra xem trong kh i d li u đ ầ ệ l n th c hi n g n nh t có ph n t vào ị ả ề ộ không, n u có thì hàm feof() tr v m t giá tr ị ư khác 0, còn n u ch a thì tr v giá tr 0.
26
ả ề ế
fseek(f,10,SEEK_SET);
ộ ố
M t s thao tác khác
Hàm fseek()
ỏ ệ
ị
ể
ả ầ
n có th âmể
ầ int fseek(FILE* con_tr _t p, long int n, int v _trí_ban_đ u); ỏ ệ ừ ể ị Hàm fseek() dùng đ d ch chuy n con tr t p t ộ ộ ị v _trí_ban_đ u đi m t kho ng cách có đ dài n bytes.
Giá tr tr v : hàm fseek() s tr v giá tr 0 n u
ẽ ả ề ị ả ề ế
ư ệ ể ị ị ả ề
Tên h ngằ
Ý nghĩa
ầ ệ
ị
ầ V trí ban đ u là đ u t p
Giá trị 0
SEEK_SET
ờ ủ
ệ
ị
1
SEEK_CUR
ị ị
ầ ỏ V trí ban đ u là v trí hi n th i c a con tr ệ ủ ệ v trí làm vi c c a t p
27
ố ệ
ị
2
ầ V trí ban đ u là cu i t p
SEEK_END
ệ ế ể ị ị nh vi c d ch chuy n thành công, và tr v giá tr khác 0 n u vi c d ch chuy n không thành công.
ộ ố
M t s thao tác khác
Hàm rewind()
ẽ ư
ỏ ệ
ớ
ươ
ề ầ Hàm rewind() s đ a con tr t p v đ u ế ỏ ệ ộ ệ t p. V i file_ptr là m t bi n con tr t p, ớ ươ ng v i ng đ hàm rewind(file_ptr) t fseek(file_ptr,0,SEEK_SET);
ị ả ề
Hàm rewind() không có giá tr tr v .
28
ỏ ệ void rewind(FILE* con_tr _t p);
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
29
int a[3]; fread(a,2,3,f); double d; fread(&d,4,1,f);
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ệ
ọ
ữ ệ Đ c d li u trên t p
ỏ ệ
ụ
ố
ố
ế
ị
ỉ
int fread(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* con_tr _t p);
Hàm fread() đ c t ố
ộ ọ ừ ệ ố ữ ệ
ụ (cid:0) c s _m c
ị ớ
ế
K t qu tr v : n u vi c đ c d li u t
t p m t kh i d li u kích ố ố s _byte bytes, sau đó ghi kh i th ỉ d li u đó lên vùng nh có đ a ch là ỉ đ a_ch _bi n. ả ả ề ế ọ t p th c
ướ ữ ệ ị ế ệ ữ ệ ừ ệ ả ề ộ
ả ố ọ c
ố ụ ự ượ t p. N u th c hi n không thành công thì hàm
30
ệ ị ự ệ ị hi n thành công, hàm fread() tr v m t giá tr nguyên là s m c (không ph i s bytes) đ c đ ừ ệ ế t ả ề fread() tr v giá tr 0.
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ệ
ữ ệ Ghi d li u trên t p
ỏ ệ
ụ
ố
ố
ế
ị
ỉ
int fwrite(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* );
ố ữ ệ b nh m t kh i d li u có
ị ớ ộ ế
(cid:0) ẽ ọ ừ ộ Hàm fwrite() s đ c t ị ỉ ỉ ắ ầ ụ ố ướ c ố s _m c bytes, sau đó nó ghi kh i
đ a ch b t đ u là đ a_ch _bi n và có kích th là s _byte ệ d li u này lên t p. ả ả ề ế ự ệ K t qu tr v : n u vi c ghi d li u lên t p th c
ố ữ ệ ế ệ ệ ữ ệ ẽ ả ề ộ
ả ố
ố ụ ự ệ ệ
31
ị ị hi n thành công, hàm fwrite() s tr v m t giá tr nguyên là s m c (không ph i s bytes) đã ghi ế lên t p. N u th c hi n không thành công thì hàm ả ề fwrite() tr v giá tr 0.
ậ ệ
ị
8.2.4. Truy nh p t p nh phân
ỏ ệ
ươ
ư ệ
ng t
ị T
ể D ch chuy n con tr t p ả ự nh t p văn b n, ta có th dùng
ể ị ị
ỏ ệ
ệ
ể
ị ớ ệ
ả ư
ư
ả
ể các hàm fseek() và rewind() đ d ch chuy n con tr t p trên t p nh phân. Hàm ớ ệ fseek() khi dùng v i t p nh phân thì không ph i l u ý nh khi dùng v i t p văn b n.
ậ
ặ
ứ
ẫ
ố
Nh n xét: Các hàm trong các c p hàm fread() – fwrite(), fscanf() – fprintf(), fputs() – fgets(), và getc() – putc() có ch c năng đ i ng u nhau.
32
Ệ Ữ Ệ
Bài 8. T P D LI U
ạ ệ
ệ
ớ ệ
8.1. Khái ni m và phân lo i t p 8.2. Các thao tác v i t p
ả
ậ ệ ậ ệ
ị
8.2.1. Khai báo 8.2.2 M t pở ệ 8.2.3. Truy nh p t p văn b n 8.2.4. Truy nh p t p nh phân 8.2.5. Đóng t pệ
33
8.2.5. Đóng t pệ
Cú pháp:
ỏ ệ
int fclose(FILE* );
Hàm fclose() tr l
ả ạ ị ế
ị i giá tr 0 n u đóng thành công, ế ệ
34
ả ề tr v giá tr EOF n u không đóng t p thành công.
Bài t pậ
Bài 1: Vi
ế ươ ng trình copy file: t ch ừ ậ bàn phím 2 xâu kí t Nh p vào t ồ ủ c a file ngu n và file đích.
ự ườ ẫ là đ ng d n
Copy n i dung c a file ngu n sang file đích.
ố ộ
ươ
ế
ng trình ghép n i n i dung 2
t ch
ủ ồ ộ
Bài 2: Vi file ậ Nh p vào t
ự ườ ẫ là đ ng d n
ừ bàn phím 2 xâu kí t ồ ủ c a file ngu n và file đích
Ghép n i dung c a file ngu n vào cu i file đích. 35
ủ ộ ồ ố
Bài t pậ
ư
ề
Bài 3: M t t p văn b n tên là "thisinh.txt" l u DL v các thí sinh và
ứ
ả ư
có t
ư
ầ
ố ượ ỗ
ế
ể
ố
ọ ậ
ự
ự
ấ
ộ
ề ộ ự đánh cho ph n th p phân, m t kí t
ầ
ộ ệ ổ ch c nh sau: Dòng đ u tên l u s l ng thí sinh. ồ ư Các dòng ti p theo m i dòng l u thông tin v m t thí sinh g m ự có: s báo danh (10 kí t ), h và tên (30 kí t ), đi m thi (4 kí t ớ v i 1 kí t cho d u "." dùng ể đ ngăn cách và 2 kí t
ự ầ ự cho ph n nguyên).
ế
Hãy vi
ng trình ữ ệ ừ ệ
ể
ị t p "thisinh.txt" và hi n th ra màn hình danh sách
ươ t ch ọ Đ c d li u t các thí sinh theo quy cách:
So thu tu So bao danh Ho ten Điem thi
ị
ế
ế
ị
ố ứ ự ị ế
ố ế
ể
ớ
ị
ị
ế
ế
ầ
ư ủ ệ
ư
ớ
ọ Trong đó s th t chi m 3 v trí, s báo danh chi m 10 v trí, h và tên chi m 30 v trí, đi m thi chi m 5 v trí v i 2 v trí dành cho ầ ậ ph n th p phân. ả ể ắ S p x p các thí sinh theo k t qu đi m thi tăng d n và l u vào ố ệ t p "thisinh2.txt" v i quy cách gi ng nh quy cách c a t p "thisinh.txt".
36