Chương 6
Tệp tin (file)
Đặt vấn đề
Các CTDL đã khảo sát có cùng 1 đặc
tính đó là được lưu trữ ở bộ nhớ trong
(RAM), do đó dữ liệu sẽ mất khi kết thúc
chương trình.
Cần có một cách tổ chức lưu trữ dữ liệu
lâu dài, đó là trên bộ nhớ ngoài (disk,
tape, ).
Trên bộ nhớ ngoài dữ liệu được tổ chức
thành các tệp tin (file).
Đặt vấn đề (tt)
Mảng Tệp
RAM
DISK
Logic View
Tệp và con trỏ tệp
Vì t
ệ
p là CTDL trên b
ộ
nh
ớ
ngoài (BNN) nên v
ớ
i các
thi
ế
t b
ị
khác nhau có cách t
ổ
ch
ứ
c l
ư
u tr
ữ
v
ậ
t lý khác
nhau.
Điề
u này gây tr
ở
ng
ạ
i cho ch
ươ
ng trình khi
mu
ố
n truy xu
ấ
t t
ệ
p (vì nó c
ầ
n ph
ả
i bi
ế
t nó
đang l
àm
vi
ệ
c v
ớ
i thi
ế
t b
ị
gì, theo cách nh
ư
th
ế
nào ).
Để
kh
ắ
c ph
ụ
c, C xây d
ự
ng
đố
i t
ượ
ng “dòng”
(
stream).
Ch
ươ
ng trình ch
ỉ
làm vi
ệ
c v
ớ
i các dòng, ph
ầ
n còn l
ạ
i
(t
ươ
ng tác gi
ữ
a “dòng” v
ớ
i file v
ậ
t lý
đượ
c x
ử
lý s
ẵ
n).
V
ớ
i cách làm nh
ư
v
ậ
y vi
ệ
c truy xu
ấ
t file tr
ở nên độ
c
l
ậ
p v
ớ
i các thi
ế
t b
ị
v
ậ
t lý.
Để
qu
ả
n lý các dòng làm vi
ệ
c v
ớ
i file C cung c
ấ
p m
ộ
t
con tr
ỏ
ki
ể
u FILE tr
ỏ đế
n vùng
đệ
m d
ữ
li
ệ
u (buffer)
c
ủ
a “dòng”.
Tệp và con trỏ tệp (tt)
Khai báo con trỏ file:
Ví dụ:
FILE *<tên con trỏ>;
FILE *f, *g;//g và f là 2 con trỏ FILE
Tệp và con trỏ tệp (tt)
Qui ước:
-
Khi mở file để đọc dữ liệu, con trỏ file trỏ đến
phần tử đầu tiên của file (phần tử thứ 0).
-
Mỗi file có một điểm kết thúc file EOF (end of
file).
-
Sau mỗi thao tác truy xuất dữ liệu, con trỏ file
tự động dịch chuyển đến phần tử kế tiếp.
EOF
f
File
Phần loại file
Ở
m
ứ
c
độ
v
ậ
t lý m
ọ
i file
đề
u nh
ư
nhau,
đề
u là dãy các
byte trên b
ộ
nh
ớ
ngoài.
Để
d
ễ
thao tác,
ở
m
ứ
c
độ
logic C chia ra 2 lo
ạ
i file:
v
ă
n b
ả
n và nh
ị
phân.
File v
ă
n b
ả
n (text):
-
d
ữ
li
ệ
u
đượ
c l
ư
u
ở
d
ạ
ng mã ASCII.
-
d
ấ
u hi
ệ
u k
ế
t thúc file EOF có mã là 26.
File nh
ị
phân (binary):
-
d
ữ
li
ệ
u
đượ
c l
ư
u
ở
d
ạ
ng các byte nh
ị phân
(không
quan tâm
đế
n ki
ể
u d
ữ
li
ệ
u mà các byte
đ
ó bi
ể
u di
ễ
n).
-
d
ấ
u hi
ệ
u k
ế
t thúc file EOF = -1.
Truy xuất file
Các hàm dùng chung cho cả hai loại file:
Hàm mở file:
Ví dụ:
Truy xuất file (tt)
Hàm đóng file:
Hàm kiểm tra kết thúc file:
Truy xuất file (tt)
Hàm xóa file:
Đọc dữ liệu:
Ghi dữ liệu:
Truy xuất file (tt)
#include <stdio.h>
#include <conio.h>
void docFile()
{
FILE *f;
char ch;
if((f=fopen("d:\\baigiang\\oop\\dulieu.txt","rt"))==NULL)
{
printf("\nloi mo file");
return;
}
while((ch=fgetc(f))!=EOF)
printf("%c",ch);
fclose(f);
}
void main()
{
docFile();
}
Ví dụ 1
Truy xuất file văn bản
Đối với file văn bản có các cách truy xuất
sau:
- T/X có định dạng: fprintf, fscanf.
- T/X chuỗi ký tự: fgets, fputs. (tự đọc)
Hàm fprintf:
Truy xuất file văn bản (tt)
Ví dụ:
Hàm fscanf:
Truy xuất file văn bản (tt)
void docfile(int a[], int *n)
{
FILE *f;
f=fopen("D:\\dulieu.txt","rt");
if(!f)
{
printf("\nkhong mo duoc file");getch();
return;
}
*n=0;
while(fscanf(f,"%d",&a[*n])!=EOF)++(*n);
fclose(f);
}
Hàm đọc dữ liệu từ file “dulieu.txt” vào mảng a
Truy xuất file nhị phân
Đối với file nhị phân có các cặp hàm t/x
sau:
getw / putw (tự đọc)
fread / fwrite
Hàm fread:
Truy xuất file nhị phân (tt)
Hàm fwrite:
Truy xuất file nhị phân (tt)
Hàm ftell:
Truy xuất file nhị phân (tt)