ự
ọ
ộ
Trường Đ i h c Khoa h c T nhiên ạ ọ ệ Khoa Công ngh thông tin ọ B môn Tin h c c
ơ sở
Ậ
Ậ
NH P MÔN L P TRÌNH
ặ
Đ ng Bình Ph
ương dbphuong@fit.hcmus.edu.vn
Ậ
T P TIN
1
&
VC
ộ
N i dung
BB
Khái niệm dòng (stream)
1
Khái niệm và phân loại tập tin
2
Các thao tác xử lý căn bản
3
Một số hàm quản lý tập tin
4
22
ậ
T p tin
&
VC
ậ
ấ Nh p xu t
BB
Khái ni mệ
ữ ệ ế ấ C lưu d li u (bi n, m ng, c u trúc, …) trong ả
ế ị ế ị ế ị ừ
ừ ự
ử t b (
ớ ộ b nh RAM. D li u ữ ệ được n p vào RAM và g i ra ngoài ế ị device) ậ (input device): bàn phím, con chu tộ t b nh p ấ (output device): màn hình, máy in t b xu t ậ ậ ấ : t p tin t b v a nh p v a xu t ọ ử ệ ế ị đều th c hi n m i x lý thông ạ chương trình thông qua các thi • Thi • Thi • Thi Các thi t b
33
ậ
T p tin
qua các dòng (stream).
&
VC
Stream (dòng)
BB
Khái ni mệ
ế Là môi trường trung gian để giao ti p (nh n/
ử ương trình và thi
ữ ử ậ
ộ ố ớ ố ẽ ử ậ ế ị t b . ế ị t b ế ị t b
g i thông tin) gi a ch Mu n nh n/g i thông tin cho m t thi ta s g i thông tin cho stream n i v i thi ộ ậ đó (đ c l p thi ế ị). t b
stream nh pậ .
ọ
• “Ch y” vào ch ả • “Ch y” ra ch ả
ương trình g i là
stream xu tấ .
44
ậ
T p tin
Stream là dãy byte d li u ữ ệ ọ ương trình g i là
&
VC
Stream (dòng)
BB
ỉ
ỗ
Phân lo iạ
ố
ự
ố đa 255 ký i ặ
ự
cu i dòng ‘\0’ ho c ký t
ở ớ
Stream văn b nả (text) • Ch ch a các ký tự. ứ • T ch c thành t ng dòng, m i dòng t ừ ứ
ừ
ả
ữ ệ ử ụ
ử ượ
ớ
ổ ự ế t , k t thúc b i ký t sang dòng m i ‘\n’. Stream nh phân ị • Ch a các ứ byte. • Được đọc và ghi chính xác t ng byte. • X lý d li u b t k , k c d li u văn b n. ấ ỳ ể ả ữ ệ • Đ c s d ng ch y u v i các t p tin trên đĩa. ậ ủ ế
55
ậ
T p tin
(binary)
&
VC
Stream (dòng)
BB
Các stream chu n ẩ định nghĩa s nẵ
Tên
Stream
Thi
ế ị ương ngứ
t b t
ậ
ẩ
stdin
Nh p chu n
Bài phím
ẩ
ấ
stdout
Xu t chu n
Màn hình
ẩ
ỗ
stderr
L i chu n
Màn hình
stdprn (MSDOS)
In chu nẩ
Máy in (LPT1:)
ố ế
ụ
ổ
stdaux (MSDOS)
C ng n i ti p COM 1: ị
ẩ Ph chu n Ví d ụ (hàm fprintf xu t ra stream xác đ nh) ấ
ỗ
t b báo l
Xu t ra màn hình: ấ Xu t ra máy in: ấ Xu t ra thi ế ị ấ i: Xu t ra t p tin (stream ậ ấ
fp):
fprintf(stdout, “Hello”); fprintf(stdprn, “Hello”); fprintf(stderr, “Hello”); fprintf(fp, “Hello”);
66
ậ
T p tin
&
VC
ậ
T p tin
BB
ớ ạ ượ ư ờ ữ ạ c l u tr t m th i
ị
ư
ữ ữ ệ : trong b nh RAM
màn hình. ớ ộ ả
i h n và đ ừ bàn phím.
. ế ượ i quy t đ
ấ ờ c bài
ầ C n m t thi t b l u tr sao cho d li u ữ ệ v n ẫ
77
ậ
T p tin
ươ ướ ạ Nhu c uầ D li u gi ữ ệ • Nh pậ : gõ t • Xu tấ : hi n th trên ể • L u tr d li u M t th i gian, không gi ớ ố ữ ệ ớ toán v i s d li u l n. ữ ộ ng trình c không h n ch ế ị ư ế còn khi k t thúc ch ề ầ và kích th nhi u l n , có th ể s d ng ử ụ ế.
&
VC
ậ
T p tin
BB
T p h p thông tin
Khái ni mệ ậ ợ ộ ạ ượ ổ ch c theo c t ị
ữ ệ (d li u) đ ộ ở
ộ ư ế ị ư
ế
ữ
t b l u tr )
ượ ư ư
. ế (tùy vào thi t b nh p
ế ị ư ậ ) và ghi
ế ị
88
ậ
T p tin
ứ ớ m t d ng nào đó v i m t tên xác đ nh. M t ộ dãy byte liên t cụ ( góc đ l u tr ). ữ Đ c l u tr trong các thi ữ ữ t b l u tr ngoài ề nh đĩa m m, đĩa c ng, USB… • V n t n t ẫ ồ ạ i khi ch • Kích th ướ c không h n ch Cho phép đ c d li u ( ọ ế ị t b xu t ứ ươ ng trình k t thúc ạ ữ ệ thi ấ ). ữ ệ thi d li u (
&
VC
ậ
T p tin
BB
Phân lo iạ
ế Theo người s d ng
ử ụ : quan tâm đ n n i dung ẽ ộ ở ộ ầ
ạ ậ t p tin nên s phân lo i theo ph n m r ng .EXE, .COM, .CPP, .DOC, .PPT, …
ự ạ Theo người l p trình ng
ườ ẽ
ử ụ ứ ậ ớ
ăn b nả ( ng v i stream ị ể ậ t p tin ki u nh phân ớ ứ ( ng v i
99
ậ
T p tin
ị ậ t o các stream t : t ị ể ế ố ớ ậ minh đ k t n i v i t p tin xác đ nh nên s ạ phân lo i theo cách s d ng stream trong C t p tin ki u v ể ả văn b n) và stream nh phân).
&
VC
ạ ậ
Phân lo i t p tin
BB
ể ăn b n)ả
ả ế ế
ự T p tin ki u văn b n (stream v ậ Dãy các dòng k ti p nhau. M i dòng dài t ố đa 255 ký t ế và k t thúc
ỗ ằ ệ b ng ký hi u cu i dòng ( end_of_line).
ộ Dòng không ph i là m t chu i ỗ vì không đ c ượ
ở i ố ả ự ế k t thúc b i ký t
ặ ‘\0’. Khi ghi ‘\n’ được chuy n thành c p ký t ự CR
ể (v ề đầu dòng, mã ASCII 13) và LF (qua dòng, mã ASCII 10).
1010
ậ
T p tin
ể Khi đọc thì c p ặ CRLF được chuy n thành
‘\n’.
&
VC
ạ ậ
Phân lo i t p tin
BB
ị ị T p tin ki u nh phân (stream nh phân)
ộ ể ậ D li u ữ ệ được đọc và ghi m t cách chính xác ,
ự
ự ế không có s chuy n k t thúc chu i ‘ ể đổi nào c .ả ỗ \0’ và end_of_line không Ký t
ố
1111
ậ
T p tin
ự có ý nghĩa là cu i chu i và cu i dòng mà ử được x lý nh ỗ ọ ư m i ký t ố . khác
&
VC
ắ
ậ
ặ Quy t c đ t tên t p tin
BB
Tên (name)
ở ộ M r ng (extension)
.
• Không bắt buộc. • Thường có 3 ký tự. • Thường do chương trình ứng dụng tạo tập tin tự đặt
• Bắt buộc phải có. • Hệ điều hành MS-DOS: dài tối đa 8 ký tự. • Hệ điều hành Windows: dài tối đa 128 ký tự. • Gồm các ký tự A đến Z, số 0 đến 9, ký tự khác như #, $, %, ~, ^, @, (, ), !, _, khoảng trắng.
1212
ậ
T p tin
&
VC
ị ậ
ị
Đ nh v t p tin
BB
ộ ậ ư ụ ườ Ch đ n m t t p tin không n m trong th m c
Đ ng d n ẫ ỉ ế ệ
ỉ ậ ủ ổ ư ụ data c a
ằ ụ c:\data\list.txt ch t p tin đĩa ượ hi n hành. Ví d : ằ list.txt n m trong th m c Trong ch C. c ghi
ự ề ươ ng trình, đ ỗ trong chu i nh sau: D u ấ ‘\’ bi u th ký t ể
ể ể đi u khi n nên đ th c.
ở ướ ộ ấ ‘\’ tr ậ ầ ng trình yêu c u nh p
ệ ư ườ ộ ấ ậ
1313
ậ
T p tin
ẫ ườ ng d n này đ ư “c:\\data\\list.txt” ể ị ả hi n nó ta ph i thêm m t d u ươ ế Nh ng n u ch ỉ ẫ ừ bàn phím thì ch nh p m t d u ng d n t đ ‘\’.
&
VC
ớ ậ
Quy trình thao tác v i t p tin
BB
ạ
ố ế ớ ậ ế ở ả ộ : t o m t stream n i k t v i t p tin ỏ ượ c qu n lý b i bi n con tr
ấ STDIO.H
ẵ c đ nh s n trong ấ ầ ượ ủ 1. M t p tin ở ậ ở ầ c n m , stream đ ấ ế FILE đ n c u trúc C u trúc đ ị ượ Các thành ph n c a c u trúc này đ c dùng
ử trong các thao tác x lý t p tin.
c t p tin) ng trình.
ươ ng trình lên t p tin.
1414
ậ
T p tin
ậ ậ 2. S d ng t p tin ở ượ ậ ậ ử ụ (sau khi đã m đ Đ c d li u ươ ư ừ ậ ữ ệ t ọ t p tin đ a vào ch Ghi d li u ậ ừ ữ ệ t ch 3. Đóng t p tin ử ụ (sau khi s d ng xong).
&
VC
ở ậ
Hàm m t p tin
BB
FILE *fopen(const char *filename, const char *mode)
ở ậ
ẫ
ng d n) là ch a trong
ứ ả
ớ ể
ườ M t p tin có tên (đ ở mode (xem b ng). filename v i ki u m
ỏ ể
FILE
ấ ắ
ậ ấ
Thành công: con tr ki u c u trúc ặ ấ ạ : NULL (sai quy t c đ t tên t p Th t b i đĩa, không tìm th y ể ọ ư
ư ụ
ở ậ
ấ ổ tin, không tìm th y th m c, m t p tin ch a có đ đ c, …)
FILE* fp = fopen(“taptin.txt”, “rt”); if (fp == NULL)
printf(“Khong mo duoc tap tin!”);
1515
ậ
T p tin
&
VC
ố ố ở ậ
Đ i s m t p tin (mode)
BB
Đ i số ố Ý nghĩa
ở ậ
b
M t p tin ki u
ị ể nh phân
(binary)
ở ậ
ặ
ị
t
M t p tin ki u
ể văn b nả (text) (m c đ nh )
ữ ệ ừ ậ
ả ề
r
ỉ ể ọ d li u t
t p tin. Tr v NULL
ch đ đ c ấ ậ
ở ậ ế
M t p tin n u không tìm th y t p tin.
ậ
w
ượ ạ ữ ệ
ữ ệ ỉ ể ch đ ghi ư ế c t o n u ch a có, ng
ẽ d li u vào t p tin. T p tin s ẽ c đó s
ậ ướ i d li u tr
c l
ế
ở ậ M t p tin ượ ạ đ ị b xóa h t.
ố ậ
ữ ệ
a
(append) d li u vào cu i t p
ỉ ể ch đ thêm ẽ ượ ạ
ư
ế
ở ậ M t p tin ậ tin. T p tin s đ
c t o n u ch a có.
ố
ữ ệ
r+
ổ ẽ ượ ạ
ư
ế
ậ
Gi ng mode r và b sung thêm tính năng ghi d li u c t o n u ch a có. và t p tin s đ
ọ
ổ
ố
w+
Gi ng mode w và b sung thêm tính năng đ c.
ọ
ổ
ố
a+
Gi ng mode a và b sung thêm tính năng đ c.
1616
ậ
T p tin
&
VC
ữ ệ
ọ
Đ c và ghi d li u (stdio.h)
BB
ự
ể
ạ
Nh p/xu t ậ Th c hi n đ c/ghi d li u theo các cách sau: ọ ệ ữ ệ Nh p/xu t ị ấ theo đ nh d ng ậ • Hàm: fscanf, fprintf • Chỉ dùng v i t p tin ớ ậ ừ ấ t ng ký t ậ lên t p tin
ớ ậ
ể
ả . ki u văn b n ự hay dòng • Hàm: getc, fgetc, fgets, putc, fputs • Ch nên ả . ỉ dùng v i ớ ki u văn b n ể Đ c/ghi ữ ệ ừ ộ ế d li u t ự ọ b nh lên t p tin tr c ti p • Hàm: fread, fwrite • Chỉ dùng v i t p tin
ị ki u nh phân
.
1717
ậ
T p tin
ậ ớ
&
VC
ạ
ấ
ị
Hàm xu t theo đ nh d ng
BB
int fprintf(FILE *fp, char *fnt, …)
ữ ệ
ạ
ỗ
fnt (gi ng ố
ế
ố
ị Ghi d li u có chu i đ nh d ng hàm printf) vào stream fp. N u fp là
stdout thì hàm gi ng printf.
ượ
ả ề ố
c.
ượ
ấ ạ : tr v
ả ề EOF (có giá tr là 1, đ
ị ử ụ
ả
Thành công: tr v s byte ghi đ Th t b i c ị đ nh nghĩa trong STDIO.H, s d ng trong ể ậ t p tin có ki u văn b n) int i = 2912; int c = ‘P’; float f = 17.06; FILE* fp = fopen(“taptin.txt”, “wt”); if (fp != NULL)
fprintf(fp, “%d %c %.2f\n”, i, c, f);
1818
ậ
T p tin
&
VC
ậ
ạ
ị
Hàm nh p theo đ nh d ng
BB
int fscanf(FILE *fp, char *fnt, …)
ọ
ữ ệ
ạ
fnt (gi ng ố
ừ
ế
ố
Đ c d li u có chu i đ nh d ng hàm scanf) t stream N u fp là
ỗ ị fp. stdin thì hàm gi ng printf.
ả ề ố
ầ
ọ
Thành công: tr v s thành ph n đ c và ư l u tr đ Th t b i
ữ ượ c. ấ ạ : tr v
ả ề EOF.
int i; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)
fscanf(fp, “%d”, &i);
1919
ậ
T p tin
&
VC
ạ
ậ
ị
Hàm nh p theo đ nh d ng
BB
Ví dụ
ứ ộ ậ ỗ
ạ ỗ ị
M t t p tin ch a nhi u dòng, m i dòng là
ề
thông tin m i sinh viên theo đ nh d ng sau:
•
ỗ
không g pặ ký t ự
ỗ
ộ g pặ m t trong
2020
ậ
T p tin
ự ừ ữ Đ c chu i thông tin ph c h p ứ ợ ọ %[chu i]ỗ : đ c cho đ n khi ế ọ ừ nào trong chu i thì d ng. %[^chu i]ỗ : đ c cho đ n khi ế ọ ỗ trong chu i thì d ng. nh ng ký t
&
VC
Hàm Tách 2 M ngả
BB
struct SINHVIEN {
// 0312078 // H. P. Trang
char MSSV[8]; char HoTen[30]; char GioiTinh[4]; // Nu char NTNS[9]; float DiemTB;
// 17/06/85 // 8.5
}; void main() {
SINHVIEN sv; FILE *fp = fopen(“dssv.txt”, “rt”); if (fp != NULL) {
fscanf(fp, “%[^-]-%[^(](%[^)])\t%[^\t]
\t%f”, &sv.MSSV, &sv.HoTen, &sv.GioiTinh, &sv.NTNS, &sv.DiemTB);
fclose(fp);
}
}
2121
ậ
T p tin
&
VC
ậ
ự
Hàm nh p ký t
BB
int getc(FILE *fp) và int fgetc(FILE *fp)
ọ
ự ừ t
stream
fp.
ả
ộ Đ c m t ký t getc là macro còn fgetc là phiên b n hàm ủ c a macro
getc.
ự ọ
c sau khi
đ c đ
Thành công: tr v ký t
ố
ượ ả ề ấ chuy n sang s nguyên không d u.
ế ả ề EOF khi k t thúc stream
ạ : tr v ặ ỗ i.
ể ấ Th t b i ặ fp ho c g p l char ch; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)
ch = getc(fp); // ch = fgetc(fp);
2222
ậ
T p tin
&
VC
ỗ ậ Hàm nh p chu i
BB
Int fgets(char *str, int n, FILE *fp)
ọ
ộ
ự ừ t
ặ
stream ủ n1 ký t
fp vào vùng ặ ự ho c g p
ự
ố
Đ c m t dãy ký t nh ớ str, k t thúc khi đ ế xu ng dòng. ký t
ả ề str.
ặ
ỗ
ặ
ả ề NULL khi g p l
i ho c
Thành công: tr v ạ : tr v Th t b i ự EOF. ặ
ấ g p ký t
char s[20]; FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)
fgets(s, 20, fp);
2323
ậ
T p tin
&
VC
ấ
ự
Hàm xu t ký t
BB
int putc(int ch, FILE *fp) và int fputc(in ch, FILE *fp)
ự ch vào stream fp.
ả
Ghi ký t putc là macro còn fputc là phiên b n hàm ủ c a macro
putc.
ự ch.
Thành công: tr v ký t Th t b i
ả ề ả ề EOF.
ấ ạ : tr v
FILE* fp = fopen(“taptin.txt”, “rt”); if (fp != NULL)
putc(‘a’, fp); // ho c ặ fputc(‘a’, fp);
2424
ậ
T p tin
&
VC
ỗ ấ Hàm xu t chu i
BB
int fputs(const char *str, FILE *fp)
ỗ
ố
ự str vào stream fp. N u ế fp là puts
puts, nh ng ư
ự
ố
Ghi chu i ký t stdout thì fputs gi ng hàm ghi ký t
xu ng dòng.
ự
ố
cu i cùng đã ghi.
Thành công: tr v ký t Th t b i
ả ề ả ề EOF.
ấ ạ : tr v
char s[] = “Ky thuat lap trinh”; FILE* fp = fopen(“taptin.txt”, “wt”); if (fp != NULL)
fputs(s, fp);
2525
ậ
T p tin
&
VC
ế
ấ ự Hàm xu t tr c ti p
BB
int fwrite(void *buf, int size, int count, FILE *fp)
ẫ
ướ
ẫ
ỗ
ừ
c m i m u ớ buf vào stream
Ghi count m u tin có kích th tin là size (byte) t vùng nh ị ể fp (theo ki u nh phân).
ẫ ng m u tin
(không ph i s l
ả ề ố ượ ng byte) đã ghi.
Thành công: tr v s l ả ố ượ ố ượ
ng nh h n
ấ ạ : s l
Th t b i
ỏ ơ count.
int a[] = {1, 2, 3}; FILE* fp = fopen(“taptin.dat”, “wb”); if (fp != NULL)
fwrite(a, sizeof(int), 3, fp);
2626
ậ
T p tin
&
VC
ự
ế
ậ
Hàm nh p tr c ti p
BB
int fread(void *buf, int size, int count, FILE *fp)
ướ
ẫ
ừ
ỗ c m i m u stream
ị
ẫ Đ c ọ count m u tin có kích th tin là size (byte) vào vùng nh ớ buf t ể fp (theo ki u nh phân).
ẫ ng m u tin
ậ ự
ọ
(không ph i s l ấ ạ : s l
ỏ ơ count khi k t ế
Th t b i
ả ề ố ượ Thành công: tr v s l ả ố ượ ng byte) th t s đã đ c. ố ượ ng nh h n ặ ỗ ặ i.
thúc stream fp ho c g p l int a[5]; FILE* fp = fopen(“taptin.dat”, “wb”); if (fp != NULL)
fread(a, sizeof(int), 3, fp);
2727
ậ
T p tin
&
VC
ị
ậ Hàm đóng t p tin xác đ nh
BB
int fclose(FILE *fp)
ẽ ượ
fp s đ
c “vét” (ghi
ữ ệ ế
ướ
Đóng stream fp. D li u trong stream h t lên đĩa) tr
c khi đóng.
ả ề Thành công: tr v 0. ả ề EOF. Th t b i
ấ ạ : tr v
FILE* fp = fopen(“taptin.txt”, “rt”); … fclose(fp);
2828
ậ
T p tin
&
VC
ấ ả
Hàm đóng t
t c stream
BB
int fcloseall()
ấ
ượ
ở
t c stream đang đ
ừ
ạ c m ngo i ẩ stdin, stdout, stdprn,
ừ
ả Đóng t tr các stream chu n stderr, stdaux. Nên đóng t ng stream thay vì đóng t
ấ ả t c .
ả ề ố ượ
ượ
Thành công: tr v s l
ng stream đ
c
đóng.
Th t b i
ấ ạ : tr v
ả ề EOF.
FILE* fp1 = fopen(“taptin1.txt”, “rt”); FILE* fp2 = fopen(“taptin2.txt”, “wt”); … fcloseall();
2929
ậ
T p tin
&
VC
ữ ệ
“Vét” d li u trong stream
BB
ế
ạ ươ c
ộ
ử ụ ở ng trình k t thúc, các stream đang m i. Tuy nhiên, ta ườ ng minh các stream sau ấ
ươ ướ ậ ng trình c khi ch
Khi ch ẽ ượ “vét” (flush) và đóng l s đ nên đóng m t các t ể khi s d ng xong (nh t là các stream t p tin) đ tránh các s c x y ra tr ế k t thúc bình th ể ự ố ả ườ ng. ữ ệ
ộ
3030
ậ
T p tin
ấ ả Ta có th “vét” d li u trong stream mà không ằ ầ c n đóng stream đó b ng m t trong hai hàm: Vét stream fp xác đ nh: ị int fflush(FILE *fp); Vét t ở int flushall(); t c stream đang m :
&
VC
ỏ
ỉ
ị
Con tr ch v (position indicator)
BB
Khái ni mệ
ơ ở ậ ọ ậ
a hay a+)
• •
ở ể ị
cu i t p tin khi m đ chèn (mode ở ớ đ u t p tin (hay giá tr 0) khi m v i các mode
ở ở ầ ậ ị đ u t p tin (giá tr 0).
3131
ậ
T p tin
Đ c t o t ượ ạ ự ộ đ ng khi m t p tin. Xác đ nh n i di n ra vi c đ c/ghi trong t p tin ị ễ ệ V trí con tr ch v ị ỉ ỏ ị Khi t p tin ch a m : ư ậ Khi m t p tin: ở ậ Ở ố ậ Ở ầ ậ khác (w, w+, r, r+).
&
VC
ầ ự
ấ Truy xu t tu n t
ẫ & ng u nhiên
BB
ầ ự
ị ế ỉ
ướ (sequentially access) Ph i đ c/ghi d li u t ỏ ữ ệ ừ ị v trí con tr ch v đ n ữ ệ ạ ị ọ c khi đ c d li u t
Truy xu t tu n t ấ ả ọ ị v trí n1 tr ầ i v trí n. ỉ ỏ ế
Không c n quan tâm đ n con tr ch v ị ỉ
ị do ế ể đ ng chuy n sang v trí k ữ ệ
ẫ ị ự ộ ỏ con tr ch v t ọ ế ti p sau thao tác đ c/ghi d li u. Truy xu t ng u nhiên (random access)
ạ ị ấ ỳ ấ Có th đ c/ghi t ể ọ
ậ ộ ữ ệ ầ
3232
ậ
T p tin
ướ ỏ ỉ i v trí b t k trong t p tin ả ọ mà không c n ph i đ c/ghi toàn b d li u tr quan tâm đ n con tr ch v ế c đó ị.
&
VC
ặ ạ ị
ỏ
ỉ
ị
Hàm đ t l
i v trí con tr ch v
BB
void rewind(FILE *fp)
ị ề ầ
ỏ
ỉ
ặ ạ ị Đ t l i v trí con tr ch v v đ u (byte 0) ậ fp. t p tin
Không
FILE* fp = fopen(“taptin.txt”, “w+”); fprintf(fp, “0123456789”); rewind(fp); fprintf(fp, “*****”);
3333
ậ
T p tin
&
VC
ỏ
ị
ỉ
ị
ị Hàm tái đ nh v con tr ch v
BB
int fseek(FILE *fp, long offset, ing origin)
ỉ
ặ ị
ầ ậ
ị
ị ớ ị fp v i v ố origin (SEEK_SET SEEK_CUR hay 1: v trí ố ậ
ỏ Đ t v trí con tr ch v trong stream ớ ộ trí offset so v i c t m c hay 0: đ u t p tin; hi n t
ệ ạ SEEK_END hay 2: cu i t p tin)
i;
ả ề
Thành công: tr v 0. ị Th t b i
ả ề ấ ạ : tr v giá tr khác 0.
ố ậ ạ
FILE* fp = fopen(“taptin.txt”, “w+”); fseek(fp, 0L, SEEK_SET); // rewind(fp); fseek(fp, 0L, SEEK_END); // cu i t p tin fseek(fp, 2L, SEEK_CUR);// lùi l
ị i 2 v trí
3434
ậ
T p tin
&
VC
ỏ
ỉ
ị
ị
ị Hàm xác đ nh v trí con tr ch v
BB
long ftell(FILE *fp)
ị
ỏ ứ
ầ
ị ệ ạ ủ ả ề ị i c a con tr ch v ủ ậ ừ ị v trí đ u tiên c a t p tin, t c là 0)
Hàm tr v v trí hi n t (tính t ủ c a stream
fp.
ả ề ị
ệ ạ ủ
i c a con
Thành công: tr v v trí hi n t ị ỉ ỏ tr ch v . Th t b i
ấ ạ : tr v
ả ề 1L.
FILE* fp = fopen(“taptin.txt”, “rb”); fseek(fp, 0L, SEEK_END); long size = ftell(fp); printf(“Kich thuoc tap tin la %ld\n”, size);
3535
ậ
T p tin
&
VC
ệ
ậ
ấ
ế D u hi u k t thúc t p tin
BB
ế t kích th c t p tin
ướ ậ ể ư ẫ
S d ng fwrite đ l u n m u tin ẫ ướ
ướ ậ ỉ ậ Khi đã bi ử ụ kích th c = n * sizeof(1 m u tin); S d ng ế ợ ử ụ hàm fseek k t h p hàm ftell Khi ch a bi ế ư t kích th H ng s ằ c t p tin ả ) ố EOF (=1) (ch cho t p tin văn b n
while ((c = fgetc(fp)) != EOF) …
ả
ố ậ ế ế
3636
ậ
T p tin
ả ề ố ả ề ố ố ậ ế Hàm int feof(FILE *fp) (cho c 2 ki u t p tin) ể ậ tr v s 0 n u ch a đ n cu i t p tin ư tr v s khác 0 n u đã đ n cu i t p tin. ế
&
VC
ậ
ả Các hàm qu n lý t p tin
BB
là các
fprintf, fscanf
ỗ fputc, fputs, fgetc, fgets
ớ fwrite, fread
fopen, fclose
Hàm qu n lý t p tin (FileManagement function)
remove
3737
ậ
T p tin
ậ ổ Hàm nh p xu t t p tin (File I/O function) ấ ậ ậ ề ậ ướ ầ đã đ c p ph n tr c M và đóng t p tin: ậ ở Nh p/Xu t t p tin: ấ ậ ậ • Theo đ nh d ng: ạ ị • T ng ký t ự ừ hay chu i: • Tr c ti p t ế ừ ộ ự b nh : ậ ả Xóa t p tin: ậ Đ i tên t p tin: rename
&
VC
ậ
Hàm xóa t p tin
BB
int remove(const char *filename)
ậ
ị
Xóa t p tin xác đ nh b i
ở filename.
ả ề
ả ề Thành công: tr v 0. ấ ạ : tr v 1. Th t b i
if (remove(“c:\\vc.txt”) == 0)
printf(“Tap tin vc.txt da bi xoa!”);
else
printf(“Ko xoa duoc tap tin vc.txt!”);
3838
ậ
T p tin
&
VC
ậ
ổ
Hàm đ i tên t p tin
BB
int rename(const char *oldname, const char *newname)
ổ
ậ
oldname thành newname. ả
ư
ph i cùng ả
ổ đĩa nh ng không ể ử ụ (có th s ư
ể
ậ
Đ i tên t p tin ậ Hai t p tin ầ ế c n thi t ph i cùng th m c ể ụ d ng đ di chuy n hay sao chép t p tin).
ả ề
ả ề Thành công: tr v 0. ấ ạ : tr v 1. Th t b i
if (rename(“c:\\a.txt”, “c:\\BT\b.cpp”) == 0)
printf(“Doi ten tap tin thanh cong”);
else
printf(“Doi ten tap tin that bai”);
3939
ậ
T p tin
&
VC
ậ
ế Bài t p lý thuy t
BB
ự ể ả Bài 1: S khác nhau gi a stream ki u văn b n ữ
ị
ổ ‘\n’
ự ự ệ ể ổ
ọ
ướ ả ấ ố ể và stream ki u nh phân? Stream văn b n t ự ể ả ự ộ đ ng chuy n đ i ký t ị ặ CRLF trong khi stream nh thành c p ký t ệ phân không th c hi n vi c chuy n đ i này (xem ư ự ề đ u nh nhau). m i ký t Bài 2: C n ph i làm gì tr ầ c khi mu n truy xu t
ế ố ớ ậ ở ậ ạ ầ
4040
ậ
T p tin
ở ằ ậ t p tin? M t p tin (t o stream k t n i v i t p tin c n m ) b ng hàm fopen.
&
VC
ậ
ế Bài t p lý thuy t
BB
ầ ở ậ
ẽ ả ề
ị ậ ị ầ ở
ỏ ế ậ ể c dùng thay cho t p tin
ấ ậ ể ng pháp đ truy xu t t p tin?
Bài 3: Khi m t p tin b ng fopen, ta c n ph i ả ằ xác đ nh thông tin nào và hàm s tr v cái gì? C n xác đ nh tên t p tin c n m và mode m ở ầ ẽ ả ề ộ ậ t p tin này. Hàm s tr v m t con tr đ n ki u ượ ỏ FILE, con tr này đ ươ ng trình. trong ch Bài 4: Ba ph ươ ị ạ
ự .
4141
ậ
T p tin
1. Theo đ nh d ng. 2. Theo ký t ỗ ự / chu i ký t 3. Tr c ti p t ớ ế ừ ộ ự b nh .
&
VC
ậ
ế Bài t p lý thuy t
BB
ừ ậ ươ ể ọ ng pháp đ đ c thông tin t t p
ứ ự (theo th t )
ầ ự ẫ ạ ị ấ ỳ i v trí b t k )
Bài 5: Hai ph tin là gì? 1. Truy xu t tu n t ấ 2. Truy xu t ng u nhiên (t ấ ị ủ Bài 6: Giá tr c a EOF?
ị
1 (đ nh nghĩa trong STDIO.H) ằ
Bài 7: Ta dùng h ng ký hi u EOF đ làm gì? ả ượ ớ
4242
ậ
T p tin
ệ ậ ố ậ ử ụ ị ằ ể Đ c s d ng v i các t p tin ki u văn b n ể ệ ấ nh m xác đ nh d u hi u cu i t p tin.
&
VC
ậ
ế Bài t p lý thuy t
BB
ố ậ ể ị Bài 8: Cách xác đ nh cu i t p tin trong ki u văn
ị ả ể
ả
ể ử ụ ử ụ ể ể ậ ằ
ả ỉ ị
ị ị
ỏ ỏ ỉ ễ ơ ổ ị ọ ị ằ
4343
ậ
T p tin
ề ầ ậ ỉ ề ị ấ ỳ b n và ki u nh phân? S d ng hàm foef cho c hai ki u t p tin. Trong ki u văn b n có th s d ng h ng EOF. Bài 9: Con tr ch v là gì và cách thay đ i nó? ổ Con tr ch v đánh d u v trí trong c a m t ộ ủ ấ ậ t p tin, n i di n ra các thao tác đ c/ghi. Thay đ i v trí con tr ch v b ng hàm rewind ỏ (v đ u t p tin) và fseek (v v trí b t k ).
&
VC
ậ
ế Bài t p lý thuy t
BB
ư ằ Bài 10: N u m m t t p tin ch a có (b ng mode
ở ộ ậ ị ủ ị
ầ t giá tr c a con tr ch v lúc đ u? ủ ậ ỏ ị ự ầ ỉ ế ị đ u tiên c a t p
ế ế w), cho bi Con tr ch v ch đ n ký t ỉ ỏ ị tin (v trí 0).
ấ ả ậ t l nh đóng t t c các stream t p tin. Bài 11: Vi
ế ệ fcloseall();
ể ể Bài 12: Trình bày hai cách khác nhau đ chuy n
ỉ ỏ ị ề ầ ậ
4444
ậ
T p tin
con tr ch v v đ u t p tin fp. 1. rewind(fp); 2. fseek(fp, 0, SEEK_SET);
&
VC
ậ
ế Bài t p lý thuy t
BB
ạ ươ Bài 13: Đo n ch ng trình sau có sai không?
void main() {
FILE *fp; int c; if ((fp = fopen(“abc.xyz”, “rb”)) == NULL)
printf(“Khong mo duoc tap abc.xyz\n”);
else {
while ((c = fgetc(fp)) != EOF)
fprintf(stdout, “%c”, c);
fclose(fp);
}
}
4545
ậ
T p tin
&
VC
ự
ậ
Bài t p th c hành
BB
đ c nh p t
Bài 14: Vi ượ Bài 15: Vi
ế t ch ậ ừ ế t ch ừ ộ ậ ả ươ bàn phím vào m t t p tin. ọ ươ i ph ố ng trình ghi 3 s nguyên a, b, c ộ ậ ố ng trình đ c 3 s nguyên a, b, ươ ng trình ax
ế
2+ c t m t t p tin, sau đó gi ả bx + c = 0 r i ghi k t qu vào m t t p tin khác. ừ ầ
ế ọ ồ t ch
ng trình đ c n s nguyên t ắ ướ ế ộ ậ ố c, sau đó s p x p tăng d n
ả
4646
ậ
T p tin
Bài 16: Vi ươ ộ ậ m t t p tin cho tr ụ ế ồ r i ghi k t qu vào 1 t p tin khác. Ví d : 4 2 5 1 4 ậ 4 1 2 4 5
&
VC
ự
ậ
Bài t p th c hành
BB
ả ng trình ghi các dòng văn b n
đ c nh p t
ươ bàn phím lên t p tin. ươ ậ ộ ộ ậ ng trình in n i dung m t t p tin Bài 17: Vi ượ Bài 18: Vi
ế ự ươ ế t ch ậ ừ ế t ch lên màn hình. t ch
ế
ộ ậ ố ế ng trình đ m s ký t ộ ậ ấ ế ả ố ừ ủ ậ ng trình đ m s t và xu t k t qu ra m t t p tin khác.
ố ầ ặ ạ ủ ế ng trình đ m s l n l p l t ch i c a
4747
ậ
T p tin
Bài 19: Vi ữ ch cái ủ ậ c a t p tin và xu t k t qu ra m t t p tin khác. Bài 20: Vi ế c a t p tin ấ ế Bài 21: Vi ế ộ ừ m t t ươ t ch ả ươ ộ ậ trong m t t p tin.
&
VC
ự
ậ
Bài t p th c hành
BB
ế ươ ở ậ ả Bài 22: Vi t ch ng trình m t p tin văn b n đã
ổ ả ng đ i
ự ệ ấ ả ổ ộ ậ ữ ườ khác không đ i.
t ch
t c các ký t ng trình ghép 2 t p tin văn ượ ứ ả ậ ậ c ghép sau t p
ướ
ộ ậ ộ c. ấ ươ có trên đĩa, sao chép nó thành m t t p tin văn ề ớ ớ b n m i v i đi u ki n là các ch th ữ thành ch hoa, t Bài 23: Vi ươ ế ậ ộ b n, n i dung t p tin th hai đ ấ ứ tin th nh t. Bài 24: Vi ế Bài 25: Vi ế ng trình ghi m t danh sách c u
4848
ậ
T p tin
t sao sao chép m t t p tin cho tr t ch ậ ể ạ ọ ố trúc xu ng t p tin sau đó đ c lên ki m tra l i.