VI N ỆVI N Ệ Ệ Ệ CÔNG NGH THÔNG CÔNG NGH THÔNG TIN VÀ TRUY N Ề TIN VÀ TRUY N Ề THÔNG THÔNG
S CHOOL OF INFORMATION S CHOOL OF INFORMATION & COMMUNICATION TECHNOLOGY & COMMUNICATION TECHNOLOGY
TIN HỌC ĐẠI CƯƠNG TIN HỌC ĐẠI CƯƠNG PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C
BÀI 8: TỆP DỮ LIỆU BÀI 8: TỆP DỮ LIỆU
11
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
22
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
33
8.1.1. Khái niệm 8.1.1. Khái niệm
ệ ệ
ớ ớ
ế ị ế ị
c l u tr trên các thi c l u tr trên các thi
ượ ư ượ ư ề ề
ộ ộ
ớ ớ
ệ ớ ệ ớ
ệ ệ ệ ệ Khái ni m t p Khái ni m t p ữ ệ ợ ộ ậ ữ ệ FileFile) là m t t p h p các d li u ữ ệ ợ ộ ậ ữ ệ ) là m t t p h p các d li u T p d li u ( T p d li u ( ữ ệ ể ể ữ ệ có liên quan v i nhau và có cùng ki u d li u. có liên quan v i nhau và có cùng ki u d li u. ữ ớ ệ ữ ớ ệ t b nh ngoài T p đ T p đ t b nh ngoài ứ (đĩa m m, đĩa c ng, CDROM…) v i m t tên ứ (đĩa m m, đĩa c ng, CDROM…) v i m t tên ể ể nào đó đ phân bi nào đó đ phân bi
t v i nhau. t v i nhau.
44
Mô hình lưu trữ dữ liệu Mô hình lưu trữ dữ liệu
hoặc 1)1)
Bit – dữ liệu nhỏ nhất (00 hoặc Bit – dữ liệu nhỏ nhất ( Byte – 8 bits - Dùng để lưu trữ các ký tự, Byte – 8 bits - Dùng để lưu trữ các ký tự, số nguyên 1 byte số nguyên 1 byte Trường (Field) – tập các byte dữ liệu Trường (Field) – tập các byte dữ liệu Bản ghi (Record) – tập các trường Bản ghi (Record) – tập các trường Tệp (file) - một tập các bản ghi Tệp (file) - một tập các bản ghi Cơ sở dữ liệu (database) - tập các tệp Cơ sở dữ liệu (database) - tập các tệp
55
Mô hình lưu trữ dữ liệu Mô hình lưu trữ dữ liệu
66
ạ ệ ạ ệ
8.1.2. Phân lo i t p 8.1.2. Phân lo i t p
ự ự
ủ ệ ủ ệ
ườ ườ i i
ệ ệ ệ ệ
ấ ữ ệ ả ấ ữ ệ ả D a theo b n ch t d li u c a t p, ng D a theo b n ch t d li u c a t p, ng ạ ệ ạ ta chia t p thành 2 lo i: ệ ta chia t p thành 2 lo i: ả ả T p văn b n T p văn b n ị T p nh phân ị T p nh phân
77
8.1.2. Phân loại tệp (tiếp) 8.1.2. Phân loại tệp (tiếp)
ự ồ ự ồ
ầ ử ủ ầ ử ủ
g m: g m:
text file):): c a nó là các kí t c a nó là các kí t
ể ề ầ ể ề ầ
ể ể
ố ố
ớ Line Feed – có mã ASCII là 10, đ xu ng dòng m i – có mã ASCII là 10, đ xu ng dòng m i ớ
ả text file ệ ả ệ T p văn b n ( T p văn b n ( Các ph n t Các ph n t ữ ữCh cái Ch cái Ch sữ ố Ch sữ ố ấ Các d u câu ấ Các d u câu ấ Các d u cách ấ Các d u cách ể ự ề ộ ố ể ự ề ộ ố M t s kí t M t s kí t Carriage Return – có mã ASCII là 13, đ v đ u – có mã ASCII là 13, đ v đ u CR – Carriage Return CR – dòng dòng LF – Line Feed LF – ……
88
đi u khi n đi u khi n
8.1.2. Phân loại tệp (tiếp) 8.1.2. Phân loại tệp (tiếp)
binary file):): binary file
ị ị
ố c a nó là các s nh phân 0 và 1 ố c a nó là các s nh phân 0 và 1
ị ị
ở ở ố ự ố ự
ấ ấ
ự ự c mã hóa là kí t c mã hóa là kí t ả ả
ợ ợ
ệ ệ ộ ườ ộ ườ ng h p riêng c a t p ng h p riêng c a t p
ị
ị ệ ệ T p nh phân ( ị T p nh phân ( ầ ử ủ Các ph n t ầ ử ủ Các ph n t mã hóa thông tin. mã hóa thông tin. ượ ượ Thông tin đ c mã hóa b i các bit nh phân Thông tin đ c mã hóa b i các bit nh phân ữ ố ể ố ể có th là s nguyên, s th c, các c u trúc d ữ có th là s nguyên, s th c, các c u trúc d ệ ệli u… li u… ượ ế ượ ế thì khi đó N u thông tin đ thì khi đó N u thông tin đ ậ ở ị ệ t p nh phân tr thành t p văn b n. Vì v y ậ ở ị ệ t p nh phân tr thành t p văn b n. Vì v y ủ ệ ả ệ t p văn b n là m t tr ủ ệ ả ệ t p văn b n là m t tr ịnh phân. nh phân.
99
ủ ệ ủ ệ
8.1.3. Vai trò c a t p 8.1.3. Vai trò c a t p
ắ ắ
ế ế
ươ ươ
ộ ộ
ặ ặ ớ ớ
ể ấ ể ấ
ả ư ả ư ằ ở ộ ằ ở ộ ng ti n dùng đ c t gi ng ti n dùng đ c t gi
ể ử ụ ể ử ụ ữ ệ ữ ệ ớ b nh ngoài. ớ b nh ngoài. ữ ữ ữ ữ d d
t máy ng trình k t thúc ho c khi t Khi ch t máy Khi ch ng trình k t thúc ho c khi t thì các thông tin trong b nh chính (RAM) thì các thông tin trong b nh chính (RAM) không còn. không còn. ố ư ữ ữ ệ ố ư Mu n l u tr d li u lâu dài đ s d ng ữ ữ ệ Mu n l u tr d li u lâu dài đ s d ng ầ ữ cho nh ng l n sau ta ph i l u d li u lên ầ ữ cho nh ng l n sau ta ph i l u d li u lên ể ữ ệ ứ ệ ể ữ ệ ứ t p, t c là đ d li u n m ệ t p, t c là đ d li u n m T p là ph ệ ươ ệ ệ ươ ệ T p là ph ệ ệli u lâu dài. li u lâu dài.
1010
ệ ệ ệ ệ
ả ả
8.1.4. Phân bi 8.1.4. Phân bi
t t p và m ng t t p và m ng
ố ốGi ng nhau: Gi ng nhau: T p h p các ph n t T p h p các ph n t Khác nhau: Khác nhau:
ớ ớ
ộ ộ
ượ ư ượ ư
ế ế
i lâu dài, i lâu dài, ế ế
ng trình k t ng trình k t
ề ề
ắ ắ c c a m t t p c c a m t t p ướ ướ
MảngMảng ộ ượ ư ữ ộ ượ ư ữ Đ c l u tr trên b nh trong Đ c l u tr trên b nh trong ẽ ả ủ ữ ệ ủ ẽ ữ ệ D li u c a m ng s không ả D li u c a m ng s không ươ ng trình k t thúc còn khi ch ươ ng trình k t thúc còn khi ch ắ ặ ắ ặ t máy. ho c khi t ho c khi t t máy. ả ộ ủ ướ c c a m t m ng Kích th ả ộ ủ ướ c c a m t m ng Kích th ướ ỏ ơ ườ ỏ ơ ướ ườ c ng nh h n kích th th th c ng nh h n kích th ộ ệ ấ ủ c a m t t p r t nhi u. ộ ệ ấ ủ c a m t t p r t nhi u.
ủ c c a ủ c c a
ệ ồ ạ ệ ồ ạ ươ ươ t máy. t máy. ộ ệ ủ ủ ộ ệ ơ ng l n h n kích th ơ ng l n h n kích th ấ ấ
ề ề
ả ả
T pệT pệ ớ ữ Đ c l u tr trên b nh ớ ữ Đ c l u tr trên b nh ngoài ngoài ữ ệ D li u trên t p t n t ữ ệ D li u trên t p t n t ẫ v n còn dù ch ẫ v n còn dù ch thúc hay t thúc hay t ướ ướ Kích th Kích th ớ ườ th ớ ườ th ộ ộ m t m ng r t nhi u. m t m ng r t nhi u.
1111
ậ ậ ợ ợ ầ ử ầ ử ể ể cùng ki u. cùng ki u.
ứ ứ
ổ ổ
ủ ệ ủ ệ 8.1.5. T ch c c a t p 8.1.5. T ch c c a t p
h n t h n t
ượ ượ
ị c v ị c v
ủ ệ ủ ệ
ệ ệ
ẽ ự ộ ẽ ự ộ ầ ử ầ ầ ử ầ
c a t p trên đĩa. c a t p trên đĩa.
ị ớ ạ ầ ử ố ượ ệ ị ớ ạ ầ ử ố ượ ệ i h n trong t p không b gi ng ph n t S l i h n trong t p không b gi ng ph n t S l ọ ượ ố ứ ề ỗ ệ ầ ử ố ỗ ệ ượ c g i là đ ọ ứ ề M i t p đ u ch a P ầ ử cu i cùng M i t p đ u ch a P c g i là đ cu i cùng ệ End Of File indicator ế ầ ử kí hi u k t thúc t p ( ph n t ệ ế ầ ử kí hi u k t thúc t p ( End Of File indicator ph n t – EOF). – EOF). ệ ề H đi u hành s t ệ ề H đi u hành s t ữ ph n t ư trí l u tr ư ữ ph n t trí l u tr
đ ng giúp ta tìm ra đ đ ng giúp ta tìm ra đ đ u tiên đ u tiên
1212
ỏ ệ ỏ ệ
8.1.6. Con tr t p 8.1.6. Con tr t p
ấ ấ ệ ạ ệ ạ ể ể ậ ậ ờ ờ i th i đi m i th i đi m
ỏ ệ ỏ ệ ầ ầ ỏ ỏ ị ị
ẽ ự ẽ ự
ỏ ệ ỏ ệ ả ả ọ ọ ề ề ể ể
ệ ệ ố ệ ố ệ ẽ ằ ẽ ằ ượ ượ ể ể ố ố c c
ầ ử ủ ệ S ử S ử ể ậ ộ ể ậ ầ ử ủ ệ ộ Đ truy c p vào m t ph n t c a t p Đ truy c p vào m t ph n t c a t p ) hay bi n ế ỏ ệ File positon locator ụ File positon locator ) hay bi n ế ỏ ệ ụ d ng con tr t p ( d ng con tr t p ( đ m.ệđ m.ệ ị ể Dùng đ đánh d u v trí truy c p vào t p t ể ị Dùng đ đánh d u v trí truy c p vào t p t ị xác đ nh. ị xác đ nh. ẽ ở ệ Khi m t p, con tr t p s luôn tr vào v trí đ u tiên ẽ ở ệ Khi m t p, con tr t p s luôn tr vào v trí đ u tiên ủ ệ c a t p. ủ ệ c a t p. ỗ ỗ Sau m i thao tác đ c ghi trên t p, con tr t p s t 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 ị đ 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 b ng s byte đã đ d ch chuy n (tính theo byte) s b ng s byte đã đ ệ ọ ừ ệ ệ ọ ừ ệ đ c t đ c t
1313
ặ ặ t p ho c ghi lên t p t p ho c ghi lên t p
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
1414
8.2. Các thao tác với tệp 8.2. Các thao tác với tệp
ả ả
ủ ủ
ớ ệ ớ ệ
ở ệ ở ệ
Các thao tác v i t p ph i tuân th theo Các thao tác v i t p ph i tuân th theo ự ự sau: trình t sau: trình t Khai báo t pệ Khai báo t pệ ệ ể ệ M t p đ làm vi c ể M t p đ làm vi c ậ ệ Truy nh p t p ậ ệ Truy nh p t p Đóng t pệ Đóng t pệ
1515
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
1616
8.2.1. Khai báo tệp 8.2.1. Khai báo tệp
Cú pháp: Cú pháp:
FILE *ten_con_tro_tep; FILE *ten_con_tro_tep;
Ví dụ: Ví dụ:
FILE *f1, *f2; FILE *f1, *f2;
1717
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
1818
8.2.2. Mở tệp 8.2.2. Mở tệp
Cú pháp: Cú pháp:
Ten_tep Che_do_mo_tep
ten_con_tro_tep = fopen(ten_tep,che_đo_mo_tep); ten_con_tro_tep = fopen(ten_tep,che_đo_mo_tep); : Đường dẫn đến tệp cần mở. Ten_tep: Đường dẫn đến tệp cần mở. : Tùy thuộc vào mục đích sử Che_do_mo_tep: Tùy thuộc vào mục đích sử dụng tệp và bản chất dữ liệu trên tệp. dụng tệp và bản chất dữ liệu trên tệp.
Kết quả trả về: Kết quả trả về: Nếu mở thành công
Nếu mở thành công Trả về một con trỏ tệp Trả về một con trỏ tệp tương ứng với tệp đã được mở tương ứng với tệp đã được mở Nếu không Trả về con trỏ
Trả về con trỏ NULLNULL..
Nếu không
1919
8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)
"r+b", , "w+b" "r+t", , "w+t" "wb", , "ab" "wt", , "at" "a+b" vàvà "w+b", , "a+b" "a+t".. "w+t", , "a+t"
Các chế độ mở tệp: Các chế độ mở tệp: "rb",, "wb" "ab", , "r+b" "rb" "at", , "r+t" "rt", , "wt" "rt" Kí tự cuối cùng: Bản chất dữ liệu của tệp Kí tự cuối cùng: Bản chất dữ liệu của tệp Kí tự đầu tiên: Mục đích sử dụng tệp. Kí tự đầu tiên: Mục đích sử dụng tệp.
2020
8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)
2121
8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)
Ví dụ: Với khai báo: Ví dụ: Với khai báo:
FILE * f1, * f2, *f3; FILE * f1, * f2, *f3;
Để mở tệp
để đọc: sinh_vien.txt để đọc:
Để mở tệp c:\c:\ sinh_vien.txt f1 = fopen("c:\\sinh_vien.txt", "r"); f1 = fopen("c:\\sinh_vien.txt", "r"); Để mở tệp c:\ho_so.dat
để ghi: c:\ho_so.dat để ghi:
Để mở tệp
Để mở tệp
f2 = fopen("c:\\ho_so.dat", "w"); f2 = fopen("c:\\ho_so.dat", "w"); để vừa đọc và ghi: c:\abc.txt để vừa đọc và ghi: Để mở tệp c:\abc.txt
2222
f3 = fopen("c:\\abc.txt", "r+"); f3 = fopen("c:\\abc.txt", "r+");
8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)
Ví dụ để mở tệp
Chú ý: Chú ý: Khi mở tệp, nếu không chỉ rõ bản chất dữ liệu Khi mở tệp, nếu không chỉ rõ bản chất dữ liệu của tệp thì C sẽ ngầm hiểu đó là tệp văn bản. của tệp thì C sẽ ngầm hiểu đó là tệp văn bản. theo chế độ nhị c:\ho_so.dat theo chế độ nhị Ví dụ để mở tệp c:\ho_so.dat phân và để ghi, ta dùng lệnh: phân và để ghi, ta dùng lệnh:
f2 = fopen("c:\\ho_so.dat", "wb"); f2 = fopen("c:\\ho_so.dat", "wb");
2323
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
2424
8.2.3. Truy nhập tệp văn bản 8.2.3. Truy nhập tệp văn bản
Các hàm: fscanf(), fgets(), getc() fscanf(), fgets(), getc()
Các hàm: fprintf(), fputs(), putc() fprintf(), fputs(), putc()
Đọc dữ liệu từ tệp Đọc dữ liệu từ tệp Các hàm: Ghi dữ liệu lên tệp Ghi dữ liệu lên tệp Các hàm: Một số thao tác khác Một số thao tác khác Các hàm: feof(), fseek(), rewind() Các hàm: feof(), fseek(), rewind() : Để sử dụng các hàm trên, cần khai Lưu ý: Để sử dụng các hàm trên, cần khai Lưu ý stdio.h.. báo tệp tiêu đề stdio.h báo tệp tiêu đề
2525
Đọc dữ liệu từ tệp văn bản a.a. Đọc dữ liệu từ tệp văn bản
ế ả ề ộ ả ề ộ ị ị
fscanf():: Hàm Hàm fscanf() int fscanf(FILE* con_tro_tep, int fscanf(FILE* con_tro_tep, xau_dinh_dang, [danh_sach_dia_chi]); xau_dinh_dang, [danh_sach_dia_chi]); ả ả ề ế ế ả ả ề K t qu tr v : K t qu tr v : Tr v m t giá tr nguyên là s ố ếN u thành công Tr v m t giá tr nguyên là s ố N u thành công ượ ừ ệ ọ t p. c t byte đ c đ ượ ừ ệ ọ t p. c t byte đ c đ ượ ạ Tr v giá tr ị EOFEOF ả ề Tr v giá tr i c l Ng ị ả ề ượ ạ i c l Ng Ví dụ: Ví dụ:
fscanf(fptr, “%d %c”,&a, &c); fscanf(fptr, “%d %c”,&a, &c);
2626
Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)
ự ự , ,
Hàm Hàm fflush() fflush():: Khi dùng hàm ự ừ ệ ự ừ ệ
fscanf() đ nh p d li u là kí t ữ ệ ậ ể đ nh p d li u là kí t ể ữ ệ ậ fflush().. fflush() t p ta nên dùng t p ta nên dùng
Khi dùng hàm fscanf() t xâu kí t t xâu kí t Cú pháp: Cú pháp:
Hàm Hàm fflush()
int fflush(FILE* con_tro_tep); int fflush(FILE* con_tro_tep);
ệ ệ ứ ứ
ị ị
ghi toàn b d li u ch a trong vùng ứ ộ ữ ệ ứ ộ ữ ệ toàn b d li u ch a trong vùng ớ ươ ớ ằ ở ộ ớ ươ ằ ở ộ ng ng v i b nh trong) t ớ ng ng v i b nh trong) t ớ ộ ớ ủ ệ ớ ộ ớ ủ ệ
2727
fflush() ghi ủ ệ đ m c a t p (n m ủ ệ đ m c a t p (n m .. ra vùng nh c a t p trên b nh ngoài con_tro_tep ra vùng nh c a t p trên b nh ngoài con_tro_tep ị ả ề Giá tr tr v : ị ả ề Giá tr tr v : Tr v giá tr 0 ả ề ế ả ề Tr v giá tr 0 ếN u thành công N u thành công ượ ạ Tr v ả ề EOFEOF.. ả ề Tr v ượ ạ i c l Ng i c l Ng
Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)
Hàm Hàm fgets() fgets():: Cú pháp: Cú pháp: char* fgets(char* xau_ki_tu, int n, char* fgets(char* xau_ki_tu, int n, FILE* con_tro_tep); FILE* con_tro_tep);
Hàm fgets() sẽ tự động thêm kí tự xuống dòng (
Đọc từ tệp một xâu kí tự (cho phép chứa dấu cách) và gán Đọc từ tệp một xâu kí tự (cho phép chứa dấu cách) và gán xâu đọc được cho biến xau_ky_tu xau_ky_tu.. xâu đọc được cho biến Việc đọc từ tệp sẽ dừng lại khi đọc đủ n-1 kí tự hoặc khi Việc đọc từ tệp sẽ dừng lại khi đọc đủ n-1 kí tự hoặc khi nó gặp kí tự xuống dòng. nó gặp kí tự xuống dòng. ‘\n’) và kí Hàm fgets() sẽ tự động thêm kí tự xuống dòng (‘\n’) và kí tự kết thúc xâu (‘\0’, kí tự NULL) vào cuối xâu_kí_tự. tự kết thúc xâu (‘\0’, kí tự NULL) vào cuối xâu_kí_tự. Giá trị trả về: Giá trị trả về:
Trả về xâu kí tự trỏ bởi xau_ki_tu xau_ki_tu
Nếu đọc thành công Trả về xâu kí tự trỏ bởi Nếu đọc thành công Nếu có lỗi Trả về con trỏ NULL. Trả về con trỏ NULL. Nếu có lỗi
2828
Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)
getc():: Hàm Hàm getc() Cú pháp: Cú pháp:
ự ự
ự ự intint (b ng ằ (b ng ằ
ự ọ ự ọ
ượ ượ
ể ể
c sau khi đã chuy n c sau khi đã chuy n
Tr v kí t ả ề Tr v kí t ả ề
đ c đ đ c đ
ị ả ề ủ ị ả ề ủ ượ ượ
intint..
ả ề ả ề
int getc(FILE* con_tro_tep); int getc(FILE* con_tro_tep); ữ ệ ộ ộ ọ ừ ệ (m t byte d li u), sau đó t p m t kí t Đ c t ữ ệ ộ ọ ừ ệ ộ (m t byte d li u), sau đó t p m t kí t Đ c t ố ạ ổ ể ố ạ ổ ể đó sang d ng s nguyên chuy n đ i kí t đó sang d ng s nguyên chuy n đ i kí t ị ố ồ ấ cách thêm byte cao 0x00) r i l y giá tr s nguyên thu ị ố ồ ấ 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. đ c làm giá tr tr v c a hàm. đ ị ả ề Giá tr tr v : ị ả ề Giá tr tr v : ế ếN u thành công N u thành công sang d ng ạ sang d ng ạ ượ ạ Tr v giá tr ị EOFEOF.. ị Tr v giá tr ượ ạ i c l Ng i c l Ng
2929
b. Ghi dữ liệu lên tệp văn bản b. Ghi dữ liệu lên tệp văn bản
Hàm Hàm fprintf() fprintf() Cú pháp: Cú pháp:
ế ị ị Tr v m t giá tr nguyên là s ố Tr v m t giá tr nguyên là s ố
ả ề ả ề
int fprintf(FILE* con_tro_tep, int fprintf(FILE* con_tro_tep, xau_đinh_dang, [danh_sach_tham_so]); xau_đinh_dang, [danh_sach_tham_so]); fprintf() ghi d li u lên m t t p Hàm Hàm fprintf() ữ ệ ộ ệ ữ ệ ộ ệ ghi d li u lên m t t p ố con_tro_tep ỉ ị ượ con_tro_tep.. ố c ch đ nh trong tham s đ ỉ ị ượ c ch đ nh trong tham s đ ả ả ề ế K t qu tr v : ế ả ả ề K t qu tr v : ả ề ộ ếN u thành công ả ề ộ N u thành công ệ ữ ệ bytes d li u đã ghi lên t p. ệ ữ ệ bytes d li u đã ghi lên t p. ượ ạ Tr v giá tr ị EOFEOF.. ị Tr v giá tr ượ ạ i c l Ng i c l Ng
3030
Ví dụVí dụ
#include
#include
void main()
void main()
{ {
int soTK; // so tai khoan
int soTK; // so tai khoan
char tenChuTK[30]; // ten chu tai khoan
char tenChuTK[30]; // ten chu tai khoan
double soDuTK; // so tien co trong TK
double soDuTK; // so tien co trong TK
FILE *cfPtr; FILE *cfPtr; // mo tep moi de ghi, neu da co thi ghi de // mo tep moi de ghi, neu da co thi ghi de if ((cfPtr=fopen("clients.dat", "w"))==NULL){ if ((cfPtr=fopen("clients.dat", "w"))==NULL){ printf("File khong the mo duoc\n"); printf("File khong the mo duoc\n"); }} else { else { printf("Nhap vao so, ten va so du TK.\n"); printf("Nhap vao so, ten va so du TK.\n"); printf("Nhap so TK = 0 de ket thuc.\n"); printf("Nhap so TK = 0 de ket thuc.\n");
3131
do do {{
printf("? "); printf("? "); scanf("%d",&soTK); scanf("%d",&soTK); if (soTK != 0) if (soTK != 0) {{
scanf("%s %lf",tenChuTK,&soDuTK); scanf("%s %lf",tenChuTK,&soDuTK); fprintf(cfPtr, "%d %s %.2f\n", fprintf(cfPtr, "%d %s %.2f\n",
soTK, tenChuTK, soDuTK); soTK, tenChuTK, soDuTK);
}}
}} while (soTK != 0); while (soTK != 0); fclose(cfPtr); fclose(cfPtr); printf("\nDa ghi vao tep thanh cong!"); printf("\nDa ghi vao tep thanh cong!"); } //ket thuc else } //ket thuc else getch(); getch(); }}
3232
3333
Hàm fprintf có thể ghi cả xâu chứa dấu cách vào tệp Hàm fprintf có thể ghi cả xâu chứa dấu cách vào tệp Ví dụ: Sửa lại ví dụ trên nếu tenChuTK chứa cả dấu cách Ví dụ: Sửa lại ví dụ trên nếu tenChuTK chứa cả dấu cách do { do { printf("? "); printf("? "); scanf("%d",&soTK); scanf("%d",&soTK); if (soTK != 0) if (soTK != 0) {{ fflush(stdin); gets(tenChuTK); fflush(stdin); gets(tenChuTK); scanf("%lf",&soDuTK); scanf("%lf",&soDuTK); fprintf(cfPtr, "%d %s %.2f\n", fprintf(cfPtr, "%d %s %.2f\n",
soTK, tenChuTK, soDuTK); soTK, tenChuTK, soDuTK);
}}
}} while (soTK != 0); while (soTK != 0);
3434
3535
b. Ghi dữ liệu lên tệp văn bản (tiếp) b. Ghi dữ liệu lên tệp văn bản (tiếp)
fputs():: Hàm Hàm fputs() Cú pháp: Cú pháp: int fputs(char* xau_ki_tu, int fputs(char* xau_ki_tu,
FILE* con_tro_tep); FILE* con_tro_tep);
Hàm Hàm fputs()
fputs() sẽ ghi nội dung của sẽ ghi nội dung của xau_ki_tu
lên xau_ki_tu lên , tuy nhiên nó khác con_tro_tep, tuy nhiên nó khác ở chỗ nó không tự động ghi thêm kí puts() ở chỗ nó không tự động ghi thêm kí
Nếu thành công Trả về kí tự cuối cùng ghi được lên tệp Trả về kí tự cuối cùng ghi được lên tệp Nếu thành công Ngược lại Trả về giá trị Ngược lại
Trả về giá trị EOFEOF..
3636
tệp tương ứng với con_tro_tep tệp tương ứng với với hàm puts() với hàm tự xuống dòng lên tệp. tự xuống dòng lên tệp. Giá trị trả về: Giá trị trả về:
b. Ghi dữ liệu lên tệp văn bản (tiếp) b. Ghi dữ liệu lên tệp văn bản (tiếp)
Hàm Hàm putc() putc() Cú pháp: Cú pháp:
ứ ứ
ch a trong bi n ch a trong bi n
ự ự
Hàm Hàm putc()
int putc(int ch, FILE* con_tro_tep); int putc(int ch, FILE* con_tro_tep);
ự ộ ghi n i dung c a kí t ự ộ putc() ghi n i dung c a kí t ế ấ ế ấ
ủ ủ ủ ủ
ượ ượ
c ch a trong byte th p c a bi n ch) lên t p t c ch a trong byte th p c a bi n ch) lên t p t
ế intint ch (kí t ế ch (kí t ớ ứ ệ ươ ớ ứ ng ng v i ệ ươ ng ng v i
ả ề ố ả ề ố
ố ứ ự ố ứ ự
trong trong
ể intint) là s th t ) là s th t ể
ự ự
ệ ệ
Tr v s nguyên (ki u Tr v s nguyên (ki u ủ ủ ả ề ả ề
đã ghi lên t p. đã ghi lên t p. ượ ạ Tr v giá tr ị EOFEOF.. Tr v giá tr ị ượ ạ i c l i c l
ứ ứ đ đ con_tro_tep.. con_tro_tep ị ả ề Giá tr tr v : ị ả ề Giá tr tr v : ế ếN u thành công N u thành công ả b ng mã ASCII c a kí t ả b ng mã ASCII c a kí t Ng Ng Ví d :ụVí d :ụ
int m; int m; m = putc(0x2345,stdout); //m = 0x0045 = 69 ki tu E ki tu E m = putc(0x2345,stdout); //m = 0x0045 = 69
3737
c. Các thao tác khác c. Các thao tác khác
ố ệ ố ệ ố ữ ệ ố ữ ệ ầ ử ầ ử
ấ ấ ị ị
Hàm Hàm feof() feof() Cú pháp: int feof(FILE* con_tro_tep); Cú pháp: int feof(FILE* con_tro_tep); ể ư ị ệ ế ể ư Ki m tra xem đã duy t đ n v trí cu i t p hay ch a ị ệ ế Ki m tra xem đã duy t đ n v trí cu i t p hay ch a ể ọ ượ ằ ể ượ ằ c đ c b ng cách ki m tra xem trong kh i d li u đ ọ b ng cách ki m tra xem trong kh i d li u đ c đ c ự ầ ệ ở ầ EOF không l n th c hi n g n nh t có ph n t vào ự ầ ệ ở ầ EOF không l n th c hi n g n nh t có ph n t vào Tr v m t giá tr khác 0 ả ề ộ ế ả ề ộ Tr v m t giá tr khác 0 ếN u có thì N u có thì ượ ạ Tr v giá tr 0. ị ả ề ị ả ề Tr v giá tr 0. ượ ạ i c l Ng i c l Ng
3838
c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)
Hàm Hàm fseek() fseek():: Cú pháp: Cú pháp: int fseek(FILE* con_tro_tep, long int n, int fseek(FILE* con_tro_tep, long int n, int vi_tri_ban_đau); int vi_tri_ban_đau);
ỏ ệ ừ vi_tri_ban_dau vi_tri_ban_dau ỏ ệ ừ
ể ị ể ị ả ả ộ ộ ộ ộ ể Dùng đ d ch chuy n con tr t p t ể Dùng đ d ch chuy n con tr t p t đi m t kho ng cách có đ dài n bytes. đi m t kho ng cách có đ dài n bytes.
3939
ị ả ề Giá tr tr v : ị ả ề Giá tr tr v : Tr v giá tr 0 ế ị ả ề ếN u thành công ả ề Tr v giá tr 0 ị N u thành công ượ ạ Tr v giá tr khác 0 ị ả ề Tr v giá tr khác 0 ị ả ề Ng ượ ạ i c l Ng c l i
c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)
(tiếp): fseek() (tiếp):
Hàm Hàm fseek() Ví d :ụVí d :ụ
fseek(file_ptr, 50, SEEK_SET); fseek(file_ptr, 50, SEEK_SET); // con tro tep cach vi tri dau tep 50 bytes // con tro tep cach vi tri dau tep 50 bytes
Giá trị của biến n: Giá trị của biến n:
>0: Hướng dịch chuyển là về phía cuối tệp >0: Hướng dịch chuyển là về phía cuối tệp < 0: Hướng dịch chuyển về phía đầu tệp < 0: Hướng dịch chuyển về phía đầu tệp = 0: Không dịch chuyển. = 0: Không dịch chuyển.
Chú ý: Chú ý:
‘\n’ thành kí tự
‘\r’ và
và ‘\n’
Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi ‘\n’) ) thành kí tự ‘\n’ kí tự (ví dụ chuyển đổi cặp kí tự ‘\r’ kí tự (ví dụ chuyển đổi cặp kí tự Việc tính toán số bước dịch chuyển con trỏ tệp rất dễ bị sai. Việc tính toán số bước dịch chuyển con trỏ tệp rất dễ bị sai.
4040
c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)
rewind():: Hàm Hàm rewind() Cú pháp: Cú pháp:
Dùng để đưa con trỏ tệp về đầu tệp. . Dùng để đưa con trỏ tệp về đầu tệp ị ả ề Không có giá tr tr v : ị ả ề Không có giá tr tr v : Ví d :ụVí d :ụ
void rewind(FILE* con_tro_tep); void rewind(FILE* con_tro_tep);
4141
rewind(file_ptr); rewind(file_ptr); Tương đương với: Tương đương với: fseek(file_ptr,0,SEEK_SET); fseek(file_ptr,0,SEEK_SET);
Ví dụVí dụ
Nối nội dung file 1 vào file 2 Nối nội dung file 1 vào file 2
#include
#include
void main()
void main()
{{
FILE *fp1, *fp2, *fpout;
FILE *fp1, *fp2, *fpout;
char sf1[50], sf2[50], sfout[50];
char sf1[50], sf2[50], sfout[50];
int c;
int c;
printf("\nNhap ten tap tin thu nhat : ");
printf("\nNhap ten tap tin thu nhat : ");
scanf("%s", &sf1);
scanf("%s", &sf1);
printf("\nNhap ten tap tin thu hai : ");
printf("\nNhap ten tap tin thu hai : ");
scanf("%s", &sf2);
scanf("%s", &sf2);
printf("\nNhap ten tap tin ket qua : ");
printf("\nNhap ten tap tin ket qua : ");
scanf("%s", &sfout);
scanf("%s", &sfout);
4242
Ví dụ (2) Ví dụ (2)
if ((fp1 = fopen(sf1, "r")) == NULL){ if ((fp1 = fopen(sf1, "r")) == NULL){ printf("Khong the mo tap tin %s\n", sf1); printf("Khong the mo tap tin %s\n", sf1); getch(); exit(1); getch(); exit(1);
}}
if ((fp2 = fopen(sf2, "r")) == NULL){ if ((fp2 = fopen(sf2, "r")) == NULL){ printf("Khong the mo tap tin %s\n", sf2); printf("Khong the mo tap tin %s\n", sf2); getch(); exit(1); getch(); exit(1);
}}
if ((fpout = fopen(sfout, "w")) == NULL){ if ((fpout = fopen(sfout, "w")) == NULL){ printf(stderr, "Khong the mo tap tin %s\n", printf(stderr, "Khong the mo tap tin %s\n",
sfout); sfout);
getch(); exit(1); getch(); exit(1);
}}
4343
Ví dụ (3) Ví dụ (3)
while ((c = getc(fp1)) != EOF) while ((c = getc(fp1)) != EOF) putc(c, fpout); putc(c, fpout); while ((c = getc(fp2)) != EOF) while ((c = getc(fp2)) != EOF) putc(c, fpout); putc(c, fpout); fclose(fp1); fclose(fp1); fclose(fp2); fclose(fp2); fclose(fpout); fclose(fpout); printf("\nHoan tat."); printf("\nHoan tat."); getch(); getch(); } }
4444
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
4545
8.2.4. Truy nhập tệp nhị phân 8.2.4. Truy nhập tệp nhị phân
Đọc dữ liệu trên tệp Đọc dữ liệu trên tệp Ghi dữ liệu trên tệp Ghi dữ liệu trên tệp Dịch chuyển con trỏ tệp Dịch chuyển con trỏ tệp
4646
a. Đọc dữ liệu trên tệp nhị phân a. Đọc dữ liệu trên tệp nhị phân
ố ữ ệ ố ữ ệ
ướ ướ ữ ệ ữ ệ
ỉ ỉ
Tr v m t giá tr nguyên là s ố Tr v m t giá tr nguyên là s ố
ị ị ượ ừ ệ c t ượ ừ ệ c t t p. t p.
ị ị
Cú pháp: Cú pháp: int fread(void *đia_chi_bien, int so_byte, int fread(void *đia_chi_bien, int so_byte, int so_muc, FILE *con_tro_tep); int so_muc, FILE *con_tro_tep); ọ ừ ệ ộ Hàm Hàm fread() ọ ừ ệ đ c t ộ t p m t kh i d li u kích fread() đ c t t p m t kh i d li u kích bytes, sau đó ghi kh i ố so_muc*so_byte bytes, sau đó ghi kh i ố c = th c = th so_muc*so_byte ị ớ d li u đó lên vùng nh có đ a ch là ị ớ d li u đó lên vùng nh có đ a ch là dia_chi_bien.. dia_chi_bien ả ả ề ế K t qu tr v : ả ả ề ế K t qu tr v : ế ả ề ộ ếN u thành công ả ề ộ N u thành công ả ố ụ ọ ả ố ụ m c (không ph i s bytes) đ c đ ọ m c (không ph i s bytes) đ c đ ượ ạ Tr v giá tr 0. ả ề Tr v giá tr 0. ả ề i c l Ng ượ ạ i c l Ng
4747
b. Ghi dữ liệu trên tệp nhị phân b. Ghi dữ liệu trên tệp nhị phân
Cú pháp: Cú pháp:
ớ ộ ớ ộ
ẽ ọ ừ ộ ẽ ọ ừ ộ
ệ ệ
int fwrite(void *dia_chi_bien, int so_byte, int fwrite(void *dia_chi_bien, int so_byte,
ả ề ộ ả ề ộ ị ị Tr v m t giá tr nguyên là s ố Tr v m t giá tr nguyên là s ố
ệ ệ
4848
ả ố
ả ố
ả ề
ả ề ị
ị int so_muc, FILE*
c. Dịch chuyển con trỏ tệp nhị phân c. Dịch chuyển con trỏ tệp nhị phân
và rewind()
fseek() và
ặ ặ
ẫ ẫ ố ố
Tương tự như tệp văn bản, ta có thể dùng các Tương tự như tệp văn bản, ta có thể dùng các để dịch chuyển con hàm fseek() hàm rewind() để dịch chuyển con trỏ tệp trên tệp nhị phân. trỏ tệp trên tệp nhị phân. khi dùng với tệp nhị phân thì Hàm Hàm fseek() 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. không phải lưu ý như khi dùng với tệp văn bản. ậ ậNh n xét: Nh n xét: Các hàm trong các c p hàm fread() – fwrite(), fscanf() Các hàm trong các c p hàm fread() – fwrite(), fscanf() – fprintf(), fputs() – fgets(), và getc() – putc() có ch c ứ – fprintf(), fputs() – fgets(), và getc() – putc() có ch c ứ năng đ i ng u nhau. năng đ i ng u nhau.
4949
TỆP DỮ LIỆU TỆP DỮ LIỆU
8.1. Khái niệm và phân loại tệp 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. Các thao tác với tệp 8.2.1. Khai báo 8.2.1. Khai báo 8.2.2. Mở tệp 8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản 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.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp 8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập
5050
8.2.5. Đóng tệp 8.2.5. Đóng tệp
có cú fclose() có cú
Đóng tệp là đảm bảo những thay đổi dữ Đóng tệp là đảm bảo những thay đổi dữ liệu được lưu lại trên tệp. liệu được lưu lại trên tệp. Để đóng tệp ta dùng hàm fclose() Để đóng tệp ta dùng hàm pháp khai báo: pháp khai báo:
5151
int fclose(FILE*
ụ ổ ụ ổ
ợ ợ
Ví d t ng h p Ví d t ng h p
#include
#include
#include
#include
#include
#include
void main()
void main()
{{
//Xau ki tu chua ten tep thu 22
//Khai bao bien con tro tep FILE* fptr1, fptr2; //Khai bao bien con tro tep FILE* fptr1, fptr2; int i; float f, a[100]; int i; float f, a[100]; char file_name_2[20];//Xau ki tu chua ten tep thu char file_name_2[20]; clrscr(); clrscr();
// Mo tep c:\float.dat de ghi len dó 100 so thuc // Mo tep c:\float.dat de ghi len dó 100 so thuc if((fptr1 = fopen("c:\\float.dat","wb"))==NULL) if((fptr1 = fopen("c:\\float.dat","wb"))==NULL) {{ printf("\n Khong mo duoc file c:\\float.dat"); printf("\n Khong mo duoc file c:\\float.dat"); printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1); }}
5252
ụ ổ ụ ổ
ế ế
ợ ợ
Ví d t ng h p (ti p) Ví d t ng h p (ti p)
//Tao 100 so thuc và ghi vào mang a[100] //Tao 100 so thuc và ghi vào mang a[100] for(i=0;i<100;i++) for(i=0;i<100;i++)
a[i] = (i*i+1.0)/(i+1); a[i] = (i*i+1.0)/(i+1);
//Ghi cac so thuc len tep c:\float.dat //Ghi cac so thuc len tep c:\float.dat for(i=0;i<100;i++) for(i=0;i<100;i++)
fwrite(&a[i],sizeof(float),1,fptr1); fwrite(&a[i],sizeof(float),1,fptr1);
//Đong tep c:\float.dat lai de luu du lieu vua ghi //Đong tep c:\float.dat lai de luu du lieu vua ghi fclose(fptr1); fclose(fptr1); // Mo tep c:\float.dat vua tao de doc du lieu // Mo tep c:\float.dat vua tao de doc du lieu if((fptr1 = fopen("c:\\float.dat","rb"))==NULL) if((fptr1 = fopen("c:\\float.dat","rb"))==NULL) {{
printf("\n Khong mo duoc file c:\\float.dat"); printf("\n Khong mo duoc file c:\\float.dat"); printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1);
}}
5353
ụ ổ ụ ổ
ế ế
ợ ợ
Ví d t ng h p (ti p) Ví d t ng h p (ti p)
// Mo tep thu 2 co ten nhap tu ban phim // Mo tep thu 2 co ten nhap tu ban phim // Copy du lieu tu tep c:\float.dat sang tep nay // Copy du lieu tu tep c:\float.dat sang tep nay printf("\n Nhap vao ten tep thu 2: "); printf("\n Nhap vao ten tep thu 2: "); fflush(stdin); gets(file_name_2); fflush(stdin); gets(file_name_2); if((fptr2 = fopen(file_name_2,"wb"))==NULL) if((fptr2 = fopen(file_name_2,"wb"))==NULL) {{
printf("\n Khong mo duoc file printf("\n Khong mo duoc file
%s",file_name_2); %s",file_name_2);
printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1);
}} // Sao chep du lieu từ tệp c:\float.dat sang tệp thứ 2 // Sao chep du lieu từ tệp c:\float.dat sang tệp thứ 2 fread(&f,4,1,fptr1); fread(&f,4,1,fptr1); while(!feof(fptr1)) while(!feof(fptr1)) {{
fwrite(&f,4,1,fptr2); fread(&f,4,1,fptr1); fwrite(&f,4,1,fptr2); fread(&f,4,1,fptr1);
}}
5454
ụ ổ ụ ổ
ế ế
ợ ợ
Ví d t ng h p (ti p) Ví d t ng h p (ti p)
/* Dich chuyen con tro tu vi tri lam viec hien tai /* Dich chuyen con tro tu vi tri lam viec hien tai cua tep c:\float.dat ve dau tep. Đoc và hien thi cua tep c:\float.dat ve dau tep. Đoc và hien thi so thuc dau tien trong tep c:\float.dat */ so thuc dau tien trong tep c:\float.dat */ rewind(fptr1); rewind(fptr1); fread(&f,sizeof(float),1,fptr1); fread(&f,sizeof(float),1,fptr1); printf("\n So thuc dau tien tren c:\\float.dat la printf("\n So thuc dau tien tren c:\\float.dat la %f",f); %f",f); /* Doc và hien thi so thuc trong tep c:\float.dat /* Doc và hien thi so thuc trong tep c:\float.dat có so thu tu nhap tu ban phim */ có so thu tu nhap tu ban phim */
printf("\n Cho biet thu tu cua so thuc trong printf("\n Cho biet thu tu cua so thuc trong c:\\float.dat: “); c:\\float.dat: “); scanf("%d",&i); scanf("%d",&i);
5555
ụ ổ ụ ổ
ế ế
ợ ợ
Ví d t ng h p (ti p) Ví d t ng h p (ti p)
/* Dich chuyen con tro tep cua c:\float.dat /* Dich chuyen con tro tep cua c:\float.dat den vi tri tuong ung voi so thuc muon den vi tri tuong ung voi so thuc muon hien thi */ hien thi */ fseek(fptr1,(i-1)*sizeof(float),SEEK_SET); fseek(fptr1,(i-1)*sizeof(float),SEEK_SET); fread(&f,sizeof(float),1,fptr1); fread(&f,sizeof(float),1,fptr1); printf(" So thuc thu %d trong c:\\float.dat la printf(" So thuc thu %d trong c:\\float.dat la
%f",i,f); %f",i,f);
fclose(fptr1); fclose(fptr1); fclose(fptr2); fclose(fptr2); // Cho an phim bat ki de ket thuc chuong trinh // Cho an phim bat ki de ket thuc chuong trinh getch(); getch();
}}
5656
ụ ổ ụ ổ
ế ế
ợ ợ
Ví d t ng h p (ti p) Ví d t ng h p (ti p)
ệ ệ
ế ế
ả ự ả ự K t qu th c hi n: K t qu th c hi n:
5757
Nhap vao ten tep thu 2: c:\f_copy.dat Nhap vao ten tep thu 2: c:\f_copy.dat So thuc dau tien tren c:\float.dat la 1.000000 So thuc dau tien tren c:\float.dat la 1.000000 Cho biet thu tu cua so thuc trong tep c:\float.dat: 10 Cho biet thu tu cua so thuc trong tep c:\float.dat: 10 So thuc thu 10 trong c:\float.dat la 8.200000 So thuc thu 10 trong c:\float.dat la 8.200000
Bài t pậ Bài t pậ
mỗi việc viết thành một hàm. mỗi việc viết thành một hàm.
ộ ộ
ả ả
100 100
ươ ươ ậ ừ ậ ừ ượ ượ
ố ự ư ố ự ư bàn phím). bàn phím).
ỉ ỉ
ố ượ ố ượ
ầ ầ
ị ị ố ự ng các s th c, các ố ự ng các s th c, các
ỗ ố ư ỗ ố ư ố ự ố ự
ộ ộ ượ ượ
ả ả
ọ ọ
ố ự ố ự
ứ ự ứ ự
ả ả
ộ ệ ộ ệ
(cid:0) (cid:0)
ầ tăng d n và ầ tăng d n và "float_sx.dat" "float_sx.dat"
ố ố
Bài 1: Bài 1: ế ng trình, ế t ch Vi ng trình, t ch Vi bàn phím N s th c l u vào m t m ng (N Nh p t bàn phím N s th c l u vào m t m ng (N Nh p t ậ ừ ậ ừ c nh p t và N đ c nh p t và N đ ả ộ Sau đó ghi ra m t file văn b n có đ a ch là "float.dat" theo ộ ả Sau đó ghi ra m t file văn b n có đ a ch là "float.dat" theo ư ư quy cách: dòng đ u tiên l u s l quy cách: dòng đ u tiên l u s l ố ự ư ế ế ố ự ư dòng ti p theo l u các s th c, m i s l u trên m t dòng. dòng ti p theo l u các s th c, m i s l u trên m t dòng. ư ọ ạ ệ ọ ạ ệ ư c vào i t p văn b n đó và l u các s th c đ c đ Đ c l i t p văn b n đó và l u các s th c đ c đ c vào Đ c l ả ộ m t m ng. ả ộ m t m ng. ế ắ S p x p các s th c trong m ng theo th t ế ắ S p x p các s th c trong m ng theo th t ả ghi ra m t t p văn b n khác có tên là ả ghi ra m t t p văn b n khác có tên là theo quy cách gi ng nh t p theo quy cách gi ng nh t p
"float.dat".. ư ệ "float.dat" ư ệ
5858
ế ế
ậ ậ
Bài t p (ti p) Bài t p (ti p)
ệ ệ
ộ ộ
ươ ươ ồ ồ
ươ ươ ệ ệ
Bài 2: Bài 2: ế ng trình sao chép n i dung t p t ch Vi ế ng trình sao chép n i dung t p t ch Vi ng trình C có tên là mã ngu n ch ng trình C có tên là mã ngu n ch file_1.C sang t p có tên là file_2.C. file_1.C sang t p có tên là file_2.C.
5959
ế ế
ậ ậ
Bài t p (ti p) Bài t p (ti p)
ế ế
ươ ươ bàn phím 2 xâu kí t bàn phím 2 xâu kí t
ng trình copy file: ng trình copy file: là đ là đ
ủ ủ ự ự ườ ườ ẫ ng d n c a ẫ ng d n c a
ố ộ ố ộ
ồ ồ
t ch t ch
ủ ủ ươ ươ ng trình ghép n i n i dung 2 ng trình ghép n i n i dung 2
ườ ườ ự ự ủ ủ bàn phím 2 xâu kí t bàn phím 2 xâu kí t là đ là đ ẫ ng d n c a ẫ ng d n c a
ồ ồ ộ ộ ủ ủ ố ố ồ ồ
Bài 3: Vi t ch Bài 3: Vi t ch ừ ậ Nh p vào t ừ ậ Nh p vào t ồ file ngu n và file đích. ồ file ngu n và file đích. ộ Copy n i dung c a file ngu n sang file đích. ộ Copy n i dung c a file ngu n sang file đích. Bài 4: ế ế Vi Bài 4: Vi file: file: ừ ậ Nh p vào t ừ ậ Nh p vào t file ngu n và file đích file ngu n và file đích Ghép n i dung c a file ngu n vào cu i file đích. Ghép n i dung c a file ngu n vào cu i file đích.
6060