Ch ng 09
T P TIN
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
1
T p tin (file)
T t c các bi n d li u c a ch ng trình đ c l u
trong b nh RAM c a máy tính. Khi ch ng trình
k t thúc, t t c các bi n này s b xóa đi.
gi các d li u này l i khi ch ng trình k t
thúc, ta c n l u chúng d i d ng t p tin (file) vào
các thi t b l u tr nh
c ng, CD, DVD, v.v.
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
2
Mơ hình t p tin
T p tin là m t dãy các bytes d li u k t thúc b ng
ký t đ c bi t EOF
EOF (End Of File): là giá tr đ c bi t, không trùng
v i b t c giá tr c a byte d li u nào.
EOF: khi dùng các hàm đ c d li u tr v EOF là
bi t k t thúc t p tin.
(Nhi u h th ng EOF = -1)
…
1
2
3
EOF
N
N bytes d li u c a m t file
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
3
CẬc lo i t p tin
T p tin v n b n (text)
Các byte trong mơ hình t p tin ch a các ký t đ c
đ c (có ngh a) b i con ng i
T p tin có th m ra đ đ c và thay đ i b i ch ng
trình so n th o v n b n nh NOTEPAD.
T p tin nh phân (binary)
Tr n Quang
© 2016
c t o b i ch ng trình nào đó, không dành cho
con ng i đ c và hi u tr c ti p b ng NOTEPAD
Các t p tin này ph i dùng ch ng trình dành riêng
nào đó m i đ c và di n d ch đ c. Ví d file .doc
c a MS Word, file nh .jpg, file th c thi .exe, …
Ch
ng 09: File
K thu t l p trình
4
Quy trình x
lý t p tin
1. Khai báo con tr t p tin
2. M t p tin
Dùng hàm: fopen
3. Thao tác v i t p tin
c hay ghi d li u
M i l n đ c hay ghi d li u, con tr đánh d u trong
t p tin t đ ng t ng đ n ph n t ti p theo
óng t p tin
4.
Tr n Quang
© 2016
Dùng hàm fclose
Ch
ng 09: File
K thu t l p trình
5
Con tr đẬnh d u trong t p tin
N bytes d li u c a m t file
1
2
3
…
N
EOF
Sau khi m t p tin thành công, con tr đánh d u t đ ng
ch đ n byte đ u tiên c a t p tin
1
2
3
…
N
EOF
Sau khi đ c 1 byte d li u, ví d s d ng hàm fgetc()
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
6
Con tr đẬnh d u trong t p tin
1
2
3
N
…
EOF
Sau khi đã đ c xong N bytes,
con tr đánh d u ch đ n EOF
L n đ c d li u k ti p hàm đ c s tr v
giá tr EOF cho bi t đã k t thúc t p tin
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
7
Khai bẬo con tr t p tin (FILE *)
Bi n (con tr ) trong ch ng trình dùng đ g n k t
v i t p tin trên đ a đ c đ nh ngh a v i ki u đ c
bi t theo cú pháp sau:
FILE *<tên bi n>
Ví d :
FILE *fp;
Ki u FILE là ki u c u trúc do C đ nh ngh a s n
trong <stdio.h>
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
8
M t p tin
fopen (<filename>, <mode> );
Ví d : FILE *fp;
fp = fopen("c:\\test.txt", "r");
filename là tên t p tin trên đ a, chú ý dùng \\ trong
đ ng d n
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
9
Ch đ m t p tin
Ch đ
r
w
a
r+
w+
a+
Tr n Quang
© 2016
Mơ t
M t p tin đ đ c.
M t p tin đ ghi. N u t p tin đã t n t i, xóa tồn b
n i dung t p tin đó.
N i t p tin. M t p tin đã có s n ho c t o m i t p tin,
ghi vào cu i t p tin n u đã t n t i.
M t p tin cho phép đ c l n ghi. Không t o m i t p
tin n u t p tin ch a có s n.
M t p tin cho phép đ c l n ghi. T o m i t p tin n u
t p tin ch a có s n.
N i t p tin, cho phép đ c t p tin. M t p tin đã có
s n ho c t o m i t p tin, ghi vào cu i t p tin đó.
Ch
ng 09: File
K thu t l p trình
10
Ki m tra vi c m t p tin
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt", "r");
if (fp == NULL)
printf("Khong mo duoc file\n");
else {
// x lý file
}
if (fp == NULL) {
printf("Khong mo duoc file\n");
return;
}
// x lý file
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
11
óng t p tin
Cú pháp:
int fclose (FILE *fp);
Ví d :
fclose(fp);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
12
c 1 ký t t
t p tin
Cú pháp:
int fgetc (FILE *fp);
Ví d :
char c;
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt", "r");
c = fgetc (fp);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
13
Hậm ki m tra cu i t p tin
Cú pháp:
int feof (FILE *fp)
Hàm tr v giá tr khác 0 n u g p cu i file khi đ c,
trái l i hàm cho giá tr 0.
Ví d :
char c;
FILE *fp;
fp = fopen("E:\\tmp\\vidu.txt", "r");
while ( !feof(fp) ) {
c = fgetc(fp);
printf("%c", c);
}
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
14
c t t c các ký t trong t p tin vào b đ m
Gi s buffer đ l n đ ch a toàn b d li u t t p tin
void readFile(FILE* fp, char* buffer){
int i = 0;
int ch = fgetc(fp);
while(ch != EOF){
CH =
c m t ký t
buffer[i] = ch;
ch = fgetc(fp);
CH <> EOF
i += 1;
true
a CH vào b đ m
}
CH =
c m t ký t
buffer[i] = '\0';
}
Tr n Quang
© 2016
Ch
ng 09: File
false
K thu t l p trình
15
Ghi 1 ký t vậo t p tin
Cú pháp:
int fputc (char c, FILE *fp);
Ví d :
FILE *fp;
fp = fopen ("E:\\tmp\\vidu2.txt", "w");
fputc ('A', fp);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
16
Hàm fgets() – fputs()
Cú pháp:
char *fgets(char *str, int n, FILE *fp);
Dùng đ
t i đa s
Hàm tr
Hàm tr
đ
đ
v
v
c 1 chu i t file vào bi n str, n là s ký t
c
con tr t i string đ c đ c n u thành công
NULL n u x y ra l i ho c g p cu i file.
Cú pháp:
int fputs(const char *str, FILE *fp);
Tr n Quang
© 2016
Dùng đ ghi 1 chu i vào file
Hàm tr v giá tr không âm n u ghi thành công
Ch
ng 09: File
K thu t l p trình
17
fgets() – fputs()
Ví d :
char s[255];
FILE *fp;
printf ("Nhap vao 1 cau: ");
fgets (s, 255, stdin);
fp = fopen ("E:\\tmp\\vidu.txt","w+");
fputs (s, fp);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
18
fgets() – fputs()
Ví d :
char s[100];
FILE *fp;
fp = fopen ("E:\\tmp\\vidu.txt","w+");
if (fp==NULL) return 0;
fputs ("Tran van Hung\n", fp);
fputs ("Le Thi Thu Thao\n", fp);
rewind(fp);
fgets (s,100, fp);
printf ("%s", s);
// Tran Van Hung
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
19
Hậm fscanf( )
Hàm th vi n đ c d li u t t p tin theo đ nh d ng:
fscanf ( <file_ptr>, <format>, <argument, …> );
Vi c s d ng hàm fscanf() t ng t nh hàm
scanf(), ch có khác ch nh ng gì l ra nh p t
bàn phím s đ c đ c vào t t p tin.
Ví d :
fscanf (fp, "%d", &n);
fscanf (fp, "%f", &(sv1->diem_btl);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
20
Hậm fprintf ( )
Hàm th vi n ghi t p tin theo đ nh d ng:
int fprintf (<file_ptr>, <format>, <argument, …> );
Vi c s d ng hàm fprintf() t ng t nh hàm
printf(), ch có khác ch nh ng gì in ra màn hình
s đ c ghi lên t p tin.
Ví d :
fprintf (fp, "%d%s%.0g\n", 10, "!= " , gt(10));
fprintf (fp, "%s%d\n", "S= ", x*2+3);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
21
Di chuy n con tr đ n 1 v trí m i
Cú pháp:
int fseek (FILE *fp, long sb, int xp);
Trong đó
sb là s byte c n di chuy n.
xp cho bi t v trí xu t phát mà vi c d ch chuy n
đ c b t đ u t đó. xp có th nh n các giá tr sau:
SEEK_SET hay 0 : Xu t phát t
đ u file.
SEEK_CUR hay 1: Xu t phát t
v trí hi n t i
c a con tr ch v trí.
SEEK_END hay 2 : Xu t phát t
cu i file.
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
22
Di chuy n con tr đ n 1 v trí m i
Ví d :
fseek(fp, 1, SEEK_SET);
a = fgetc(fp);
printf("%c ", a);
fseek(fp, 3, SEEK_CUR);
a = fgetc(fp);
printf("%c ", a);
fseek(fp, -1, SEEK_END);
a = fgetc(fp);
printf("%c ", a);
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
23
Di chuy n con tr v đ u t p tin
Cú pháp:
int rewind (FILE *fp);
Ví d :
while (!feof(fp)) {
a = getc(fp); printf("%c", a);
}
printf("\n");
rewind(fp);
while (!feof(fp)) {
a = getc(fp); printf("%c", a);
}
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
24
XẬc đ nh v trí hi n t i c a con tr
Cú pháp:
int ftell (FILE *fp);
Ví d :
printf ("%d ", ftell (fp));
fseek (fp, -1, SEEK_END);
a = fgetc (fp);
printf ("%c ", a);
printf ("%d ", ftell(fp));
Tr n Quang
© 2016
Ch
ng 09: File
K thu t l p trình
25