Bài giảng Tin học đại cương - Bài 8: Tệp dữ liệu trình bày khái niệm và phân loại tệp; các thao tác với tệp; một số bài tập vận dụng. Mời các bạn cùng tham khảo bài giảng để nắm chi tiết nội dung kiến thức.
Trang 48.1.1 Khái niệm
Khái ni m t p ệ ệ
Khái ni m t p ệ ệ
T p d li u (T p d li u (ệệ ữ ệữ ệ File) là m t t p h p các d li u ) 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 đT p đệệ ượ ưượ ưc l u tr trên các thi t b nh ngoài 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.ể ệ ớ
Trang 5Mô hình lưu trữ dữ liệu
Bit – dữ liệu nhỏ nhất (0 hoặc 1)
Byte – 8 bits - Dùng để lưu trữ các ký tự,
số nguyên 1 byte
Trường (Field) – tập các byte dữ liệu
Bản ghi (Record) – tập các trường
Tệp (file) - một tập các bản ghi
Cơ sở dữ liệu (database) - tập các tệp
Trang 6Mô hình lưu trữ dữ liệu
Trang 78.1.2. Phân lo i t p ạ ệ
8.1.2. Phân lo i t p ạ ệ
D a theo b n ch t d li u c a t p, ng ự ả ấ ữ ệ ủ ệ ườ i
D a theo b n ch t d li u c a t p, ng ự ả ấ ữ ệ ủ ệ ườ i
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ânT p nh phânệệ ịị
Trang 88.1.2 Phân loại tệp (tiếp)
Trang 9 N u thông tin đN u thông tin đếế ượược mã hóa là kí t thì khi đó 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 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ệ ả ộ ường h p riêng c a t p ợ ủ ệ
t p văn b n là m t trệ ả ộ ường h p riêng c a t p ợ ủ ệ
nh phân.ị
Trang 108.1.3. Vai trò c a t p ủ ệ
8.1.3. Vai trò c a t p ủ ệ
Khi ch ươ ng trình k t thúc ho c khi t t máy ế ặ ắ
Khi ch ươ ng trình k t thúc ho c khi t t máy ế ặ ắ
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.
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 b nh ngoài. ệ ứ ể ữ ệ ằ ở ộ ớ
t p, t c là đ d li u n m b nh ngoài. ệ ứ ể ữ ệ ằ ở ộ ớ
T p là ph T p là ph ệ ệ ươ ươ ng ti n dùng đ c t gi d ng ti n dùng đ c t gi d ệ ệ ể ấ ể ấ ữ ữ ữ ữ
li u lâu dài ệ
li u lâu dài ệ
Trang 11Đ ượ ư 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 ữ ệ ủ ả ẽ
Đ ượ ư c l u tr trên b nh ữ ộ ớ
Đ ượ ư c l u tr trên b nh ữ ộ ớ
ngoài
D li u trên t p t n t i lâu dài, ữ ệ ệ ồ ạ
D li u trên t p t n t i lâu dài, ữ ệ ệ ồ ạ
th ườ ng l n h n kích th ớ ơ ướ c c a ủ
th ườ ng l n h n kích th ớ ơ ướ c c a ủ
m t m ng r t nhi u ộ ả ấ ề
m t m ng r t nhi u ộ ả ấ ề
Trang 128.1.5. T ch c c a t p ổ ứ ủ ệ
8.1.5. T ch c c a t p ổ ứ ủ ệ
S lố ượng ph n t trong t p không b gi i h n ầ ử ệ ị ớ ạ
S lố ượng ph n t trong t p không b gi i h n ầ ử ệ ị ớ ạ
M i t p đ u ch a P M i t p đ u ch a P ỗ ệ ỗ ệ ề ề ứ ứ h n t cu i cùng h n t cu i cùng ầ ầ ử ử ố ố đ đ ượ ượ c g i là c g i là ọ ọ
ph n t ầ ử
ph n t ầ ử kí hi u k t thúc t p ( kí hi u k t thúc t p ( ệ ệ ế ế ệ ệ End Of File indicator
– EOF).
H đi u hành s t đ ng giúp ta tìm ra đệ ề ẽ ự ộ ược v ị
H đi u hành s t đ ng giúp ta tìm ra đệ ề ẽ ự ộ ược v ị
trí l u tr ư ữ
trí l u tr ư ữ ph n t đ u tiên ph n t đ u tiên ầ ầ ử ầ ử ầ c a t p trên đĩa. c a t p trên đĩa.ủ ệủ ệ
Trang 138.1.6. Con tr t p ỏ ệ
8.1.6. Con tr t p ỏ ệ
Đ 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 ể ậ ộ ầ ử ủ ệ S S ửử
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 đã đ ị ể ẽ ằ ố ượ c
d ch chuy n (tính theo byte) s b ng s byte đã đ ị ể ẽ ằ ố ượ c
đ c t t p ho c ghi lên t p ọ ừ ệ ặ ệ
đ c t t p ho c ghi lên t p ọ ừ ệ ặ ệ
Trang 158.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 ớ ệ ả ủ
Trang 19 Nếu mở thành công Trả về một con trỏ tệp
tương ứng với tệp đã được mở
Nếu không Trả về con trỏ NULL
Trang 218.2.2 Mở tệp (tiếp)
Trang 258.2.3 Truy nhập tệp văn bản
Đọc dữ liệu từ tệp
Ghi dữ liệu lên tệp
Một số thao tác khác
Lưu ý : Để sử dụng các hàm trên, cần khai báo tệp tiêu đề stdio.h
Trang 27int fflush(FILE* con_tro_tep);
Hàm fflush() ghi toàn b d li u ch a trong vùng toàn b d li u ch a trong vùng ộ ữ ệ ộ ữ ệ ứ ứ
đ m c a t p (n m b nh trong) t ệ ủ ệ ằ ở ộ ớ ươ ng ng v i ứ ớ
đ m c a t p (n m b nh trong) t ệ ủ ệ ằ ở ộ ớ ươ ng ng v i ứ ớ
con_tro_tep ra vùng nh c a t p trên b nh ngoài ra vùng nh c a t p trên b nh ngoài ớ ủ ệ ớ ủ ệ ộ ộ ớ ớ
Trang 28a Đọc dữ liệu từ tệp văn bản (tiếp)
Hàm fgets():
char* fgets(char* xau_ki_tu, int n,
FILE* con_tro_tep);
nó gặp kí tự xuống dòng
tự kết thúc xâu (‘\0’, kí tự NULL) vào cuối xâu_kí_tự.
Nếu đọc thành công Trả về xâu kí tự trỏ bởi xau_ki_tu
Trang 29Hàm getc() :
Cú pháp:
int getc(FILE* con_tro_tep);
Đ c t t p m t kí t (m t byte d li u), sau đó Đ c t t p m t kí t (m t byte d li u), sau đó ọ ừ ệ ọ ừ ệ ộ ộ ự ự ộ ộ ữ ệ ữ ệ
chuy n đ i kí t đó sang d ng s nguyên ể ổ ự ạ ố
chuy n đ i kí t đó sang d ng s nguyên ể ổ ự ạ ố int (b ng (b ng ằ ằ
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 ị ả ề ủ
Trang 30b Ghi dữ liệu lên tệp văn bản
Trang 31int soTK; // so tai khoan
char tenChuTK[30]; // ten chu tai khoan
double soDuTK; // so tien co trong TK
printf("Nhap vao so, ten va so du TK.\n");
printf("Nhap so TK = 0 de ket thuc.\n");
Trang 32printf("\nDa ghi vao tep thanh cong!");
} //ket thuc else
getch();
Trang 3333
Trang 34Hà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
Trang 3535
Trang 36b Ghi dữ liệu lên tệp văn bản (tiếp)
Hàm fputs() :
Cú pháp:
int fputs(char* xau_ki_tu,
FILE* con_tro_tep);
Hàm fputs() sẽ ghi nội dung của xau_ki_tu lên
tệp tương ứng với con_tro_tep, 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ành công Trả về kí tự cuối cùng ghi được lên tệp Ngược lại Trả về giá trị EOF.
Trang 37b Ghi dữ liệu lên tệp văn bản (tiếp)
Hàm putc()
Cú pháp:
int putc(int ch, FILE* con_tro_tep);
Hàm putc() ghi n i dung c a kí t ch a trong bi n ghi n i dung c a kí t ch a trong bi n ộ ộ ủ ủ ự ự ứ ứ ế ế int ch (kí t ch (kí t ự ự
đ ượ c ch a trong byte th p c a bi n ch) lên t p t ứ ấ ủ ế ệ ươ ng ng v i ứ ớ
đ ượ c ch a trong byte th p c a bi n ch) lên t p t ứ ấ ủ ế ệ ươ ng ng v i ứ ớ
con_tro_tep.
Giá tr tr v : Giá tr tr v : ị ả ề ị ả ề
N u thành công ế Tr v s nguyên (ki u Tr v s nguyên (ki u ả ề ố ả ề ố ể ể int) là s th t trong ) là s th t trong ố ứ ự ố ứ ự
Trang 38c Các thao tác khác
Hàm feof()
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 ể ể ệ ế ệ ế ị ị ố ệ ố ệ ư ư
b ng cách ki m tra xem trong kh i d li u đ ằ ể ố ữ ệ ượ c đ c ọ
b ng cách 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 không ở ầ ự ệ ầ ấ ầ ử
vào l n th c hi n g n nh t có ph n t EOF không ở ầ ự ệ ầ ấ ầ ử
Trang 39 Dùng đ d ch chuy n con tr t p t Dùng đ d ch chuy n con tr t p t ể ị ể ị ể ể ỏ ệ ừ ỏ ệ ừ vi_tri_ban_dau
đi m t kho ng cách có đ dài n bytes. ộ ả ộ
đi m t kho ng cách có đ dài n bytes. ộ ả ộ
Trang 40Giá trị của biến n:
Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi
kí tự (ví dụ chuyển đổi cặp kí tự ‘\r’ và ‘\n’ thành kí tự ‘\n’)
Trang 41c Các thao tác khác (tiếp)
Hàm rewind() :
Cú pháp:
void rewind(FILE* con_tro_tep);
Dùng để đưa con trỏ tệp về đầu tệp.
Trang 43if ((fpout = fopen(sfout, "w")) == NULL){
printf(stderr, "Khong the mo tap tin %s\n",
sfout);
getch(); exit(1);
}
Trang 468.2.4 Truy nhập tệp nhị phân
Đọc dữ liệu trên tệp
Ghi dữ liệu trên tệp
Dịch chuyển con trỏ tệp
Trang 47thước = so_muc*so_byte bytes, sau đó ghi kh i bytes, sau đó ghi kh i ốố
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
K t qu tr v :ế ả ả ề
K t qu tr v :ế ả ả ề
N u thành công N u thành công ế ế Tr v m t giá tr nguyên là s Tr v m t giá tr nguyên là s ả ề ộ ả ề ộ ị ị ố ố
m c (không ph i s bytes) đ c đ ụ ả ố ọ ượ ừ ệ c t t p.
m c (không ph i s bytes) đ c đ ụ ả ố ọ ượ ừ ệ c t t p.
Ng Ng ượ ạ ượ ạ c l i c l i Tr v giá tr 0 Tr v giá tr 0 ả ề ả ề ị ị
Trang 48b Ghi dữ liệu trên tệp nhị phân
Cú pháp:
int fwrite(void *dia_chi_bien, int so_byte,
int so_muc, FILE* <con tro tep>);
Hàm fwrite() s đ c t b nh m t kh i d s đ c t b nh m t kh i d ẽ ọ ừ ộẽ ọ ừ ộ ớ ộớ ộ ố ữố ữ
li u có đ a ch b t đ u là ệ ị ỉ ắ ầ
kích thước là
nó ghi kh i d li u này lên t p.ố ữ ệ ệ
nó ghi kh i d li u này lên t p.ố ữ ệ ệ
K t qu tr v :ế ả ả ề
K t qu tr v :ế ả ả ề
N u thành công ế
N u thành công ế Tr v m t giá tr nguyên là s Tr v m t giá tr nguyên là s ả ề ộ ả ề ộ ị ị ố ố
m c (không ph i s bytes) đã ghi lên t p ụ ả ố ệ
m c (không ph i s bytes) đã ghi lên t p ụ ả ố ệ
Ng ượ ạ c l i
Ng ượ ạ c l i Tr v giá tr 0 Tr v giá tr 0 ả ề ả ề ị ị
Trang 49c Dịch chuyển con trỏ tệp nhị phân
Tương tự 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
năng đ i ng u nhau ố ẫ
năng đ i ng u nhau ố ẫ
Trang 518.2.5 Đóng tệp
Đóng tệp là đảm bảo những thay đổi dữ
liệu được lưu lại trên tệp.
N u thành công N u thành công ếế Tr v giá tr 0 Tr v giá tr 0ả ềả ề ịị
NgNgượ ạượ ạc l i c l i Tr v giá tr Tr v giá tr ả ềả ề ịị EOF.
Trang 52FILE* fptr1, fptr2; //Khai bao bien con tro tep
int i; float f, a[100];
char file_name_2[20];//Xau ki tu chua ten tep thu 2
printf("\n Khong mo duoc file c:\\float.dat");
printf("\n An phim bat ki de ket thuc!");
Trang 53printf("\n Khong mo duoc file c:\\float.dat");
printf("\n An phim bat ki de ket thuc!");
exit(1);
}
Trang 54Ví 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
// Copy du lieu tu tep c:\float.dat sang tep nay
printf("\n Nhap vao ten tep thu 2: ");
Trang 55/* Doc và hien thi so thuc trong tep c:\float.dat
có so thu tu nhap tu ban phim */
printf("\n Cho biet thu tu cua so thuc trong
c:\\float.dat: “);
scanf("%d",&i);
Trang 57Nhap vao ten tep thu 2: c:\f_copy.dat
So thuc dau tien tren c:\float.dat la 1.000000
Cho biet thu tu cua so thuc trong tep c:\float.dat: 10
So thuc thu 10 trong c:\float.dat la 8.200000
Trang 58 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 ộ ộ ả ả ị ị ỉ ỉ
Đ c l 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 vào
S p x p các s th c trong m ng theo th t tăng d n và S p x p các s th c trong m ng theo th t tăng d n và ắ ắ ế ế ố ự ố ự ả ả ứ ự ứ ự ầ ầ
Trang 59Vi t ch ế ươ ng trình sao chép n i dung t p ộ ệ
Vi t ch ế ươ ng trình sao chép n i dung t p ộ ệ
mã ngu n ch ồ ươ ng trình C có tên là
mã ngu n ch ồ ươ ng trình C có tên là
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 ệ
Trang 60Bài t p (ti p) ậ ế
Bài 3: Vi t ch Vi t chếế ươương trình copy file:ng trình copy file:
Nh p vào t bàn phím 2 xâu kí t là đ Nh p vào t bàn phím 2 xâu kí t là đ ậ ậ ừ ừ ự ự ườ ườ ng d n c a ng d n c a ẫ ẫ ủ ủ
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 t ch Vi t chếế ươương trình ghép n i n i dung 2 ng trình ghép n i n i dung 2 ố ộố ộ