Cùng tìm hiểu Tệp dữ liệu là nội dung bài 8 thuộc bộ Bài giảng Tin học đại cương Phần 2 hướng đến trình bày. Ở bài này các bạn sẽ được tìm hiểu về khái niệm và phân loại tệp; các thao tác với tệp.
Trang 1TIN H C Đ I C Ọ Ạ ƯƠ NG
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 ệ Đ
Trang 3 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 48.1. Khái ni m và phân lo i t p ệ ạ ệ
Khái ni m t p d li u: ệ ệ ữ ệ
T p d li u ( ệ ữ ệ File) là m t t p h p các d ộ ậ ợ ữ
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 ộ ể ệ ớ
T p là ph ệ ươ ng ti n dùng đ c t gi d li u ệ ể ấ ữ ữ ệ lâu dài.
Trang 58.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 ạ ệ ự ả ấ ữ ệ ủ
th là s nguyên, s th c, các c u trúc d li u… ể ố ố ự ấ ữ ệ
N u thông tin đế ược mã hóa là kí t thì khi đó t p ự ệ
nh phân tr thành t p văn b n. Vì v y t p văn ị ở ệ ả ậ ệ
Trang 68.1. Khái ni m và phân lo i t p ệ ạ ệ
T ch c c a t p ổ ứ ủ ệ
E O F . . . .
làm vi c c a t p ệ ủ ệ
Trang 78.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 ầ ử ủ ộ ệ ạ ộ ạ
m t th i đi m ta ch có th truy c p độ ờ ể ỉ ể ậ ược vào m t ộ
ph n t c a t p mà thôi. ầ ử ủ ệ
Con tr t p (File positon locator) là bi n đ m đ ỏ ệ ế ệ ểtruy c p vào m t ph n t c a t p, đánh d u v trí ậ ộ ầ ử ủ ệ ấ ịtruy c p vào t p t i th i đi m xác đ nh. ậ ệ ạ ờ ể ị
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 ệ ả ị ể ẽ
Trang 88.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 9 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 10 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 118.2.1. Khai báo t p ệ
Trong C truy nh p t p ph i thông qua ậ ệ ả con tr t p. M t con tr t p ( ỏ ệ ộ ỏ ệ file pointer)
FILE *tên_con_tr _t p; ỏ ệ
FILE *f1, *f2;
Trang 12 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 13“r” M t p đã có đ đ c, không đ ở ệ ể ọ ượ c ghi. N u t p không t n t i, hàm ế ệ ồ ạ
fopen() s tr l i tr ng thái l i ẽ ả ạ ạ ỗ
“w” 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 ở ệ ớ ể ế ệ ồ ạ ộ ủ ẽ ị ế
“a” 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 ở ệ ể ữ ệ ố ệ ế ệ ư ồ ạ ẽ
đ ượ ạ c t o m i ớ
Kí hi uệ B n ch t d li u c a ả ấ ữ ệ ủ
t pệ
“b” T p nh phân ệ ị
Trang 14 Đ m t p ể ở ệ c:\abc.txt đ v a đ c và ghi ta ể ừ ọ
Trang 15L 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 ằ ệ ở ệ
Trang 17 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 19 L u các giá tr đ c đư ị ọ ược vào danh_sách_đ a_ch ị ỉ
int fscanf(FILE* con_tr _t p, xâu_đ nh_d ng, [danh_sách_đ a_ch ]); ỏ ệ ị ạ ị ỉ
struct {
int n; char c;
Trang 20 L u các giá tr đ c đư ị ọ ược + “\n\0” vào xâu_ký_t ự
Giá tr tr v :ị ả ề n u đ c thành công hàm fgets() tr ế ọ ả
v xâu kí t tr b i xâu_kí_t , n u có l i nó s tr ề ự ỏ ở ự ế ỗ ẽ ả
char* fgets(char* xâu_kí_t , int n, FILE* con_tr _t p); ự ỏ ệ
Trang 21 Giá tr tr v : n u thành công hàm getc() tr v kí ị ả ề ế ả ề
t đ c đự ọ ược sau khi đã chuy n sang d ng ể ạ int.
int getc(FILE* con tr t p); ỏ ệ
Trang 23 Cú pháp khai báo:
Hàm fprintf() có ch c năng hoàn toàn tứ ương t ự
nh hàm printf(), ch có m t ch khác là hàm ư ỉ ộ ỗprintf() ghi d li u lên thi t b ra chu n (stdin, ữ ệ ế ị ẩthông thường là màn hình) còn fprintf() ghi d li u ữ ệlên m t t p độ ệ ược ch đ nh trong tham s ỉ ị ố
Trang 24 Cú pháp khai báo:
Hàm fputs() s ghi n i dung c a xâu_kí_t lên t p ẽ ộ ủ ự ệ
tương ng v i con_tr _t p, tuy nhiên nó khác v i ứ ớ ỏ ệ ớhàm puts() ch nó không t đ ng ghi thêm kí t ở ỗ ự ộ ự
xu ng dòng lên t p.ố ệ
Giá tr tr v :ị ả ề n u th c hi n thành công hàm ế ự ệ
fputs() tr v kí t cu i cùng mà nó ghi đả ề ự ố ược lên
t p, còn n u không thành công nó tr v giá tr ệ ế ả ề ị
int fputs(char* xâu_kí_t , FILE* con_tr _t p); ự ỏ ệ
Trang 25 Cú pháp khai báo:
Hàm putc()ghi n i dung c a kí t ch a trong bi n ộ ủ ự ứ ế
int ch (kí t đ c ch a trong byte th p c a bi n ự ượ ứ ấ ủ ế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 ị ả ề ế ẽ ả
v s nguyên (ki u ề ố ể int) là s th t trong b ng ố ứ ự ả
mã ASCII c a kí t đã ghi lên t p. N u không ủ ự ệ ế
thành công nó tr v giá tr ả ề ị EOF.
int putc(int ch, FILE* con_tr _t p); ỏ ệ
Trang 26 Hàm ki m tra xem trong kh i d li u để ố ữ ệ ược đ c ọ
vào l n th c hi n g n nh t có ph n t ở ầ ự ệ ầ ấ ầ ử EOF hay
không, n u có thì hàm feof() tr v m t giá tr ế ả ề ộ ị
Trang 27M t s thao tác khác ộ ố
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 ị ả ề ẽ ả ề ị ế
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. ế ệ ị ể
int fseek(FILE* con_tr _t p, long int n, int v _trí_ban_đ u); ỏ ệ ị ầ
Tên h ngằ Giá
n có th âm ể fseek(f,10,SEEK_SET);
Trang 28M t s thao tác khác ộ ố
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, ệ ớ ộ ế ỏ ệ
hàm rewind(file_ptr) t ươ ng đ ươ ng v i ớ
fseek(file_ptr,0,SEEK_SET);
Hàm rewind() không có giá tr tr v ị ả ề
void rewind(FILE* con_tr _t p); ỏ ệ
Trang 29 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 308.2.4. Truy nh p t p nh phân ậ ệ ị
Đ c d li u trên t p ọ ữ ệ ệ
Hàm fread() đ c t t p m t kh i d li u kích ọ ừ ệ ộ ố ữ ệ
thước s _m c ố ụ s _byte bytes, sau đó ghi kh i ố ố
d li u đó lên vùng nh có đ a ch là ữ ệ ớ ị ỉ
đ a_ch _bi n.ị ỉ ế
K t qu tr v : n u vi c đ c d li u t t p th c ế ả ả ề ế ệ ọ ữ ệ ừ ệ ự
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 đố ụ ả ố ọ ược
int fread(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* con_tr _t p); ị ỉ ế ố ố ụ ỏ ệ
int a[3];
fread(a,2,3,f);
double d;
fread(&d,4,1,f);
Trang 318.2.4. Truy nh p t p nh phân ậ ệ ị
Ghi d li u trên t p ữ ệ ệ
Hàm fwrite() s đ c t b nh m t kh i d li u có ẽ ọ ừ ộ ớ ộ ố ữ ệ
đ a ch b t đ u là đ a_ch _bi n và có kích thị ỉ ắ ầ ị ỉ ế ước
là s _byte ố s _m c bytes, sau đó nó ghi kh i ố ụ ố
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 ế ả ả ề ế ệ ữ ệ ệ ự
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 ệ ế ự ệ
int fwrite(void *đ a_ch _bi n, int s _byte, int s _m c, FILE* <con tr t p>); ị ỉ ế ố ố ụ ỏ ệ
Trang 33 8.1. Khái ni m và phân lo i t p ệ ạ ệ
Trang 348.2.5. Đóng t p ệ
int fclose(FILE* <tên con tr t p>); ỏ ệ
Hàm fclose() tr l i giá tr 0 n u đóng thành công, ả ạ ị ế
tr v giá tr EOF n u không đóng t p thành ả ề ị ế ệ
công.
Trang 35Bài t p ậ
Bài 1: Vi t ch ế ươ ng trình copy file:
Nh p vào t bàn phím 2 xâu kí t là đậ ừ ự ường d n ẫ
c a file ngu n và file đích.ủ ồ
Copy n i dung c a file ngu n sang file đích.ộ ủ ồ
Bài 2: Vi t ch ế ươ ng trình ghép n i n i dung 2 ố ộ
file
Nh p vào t bàn phím 2 xâu kí t là đậ ừ ự ường d n ẫ
Trang 36Bà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 ch c nh sau: ổ ứ ư
Hãy vi t ch ế ươ ng trình
các thí sinh theo quy cách:
So thu tu So bao danh Ho ten Điem thi