CHƯƠNG 9
CHƯƠNG
9
TẬP TIN (FILE)
TẬP
TIN
(FILE)
1. GIỚI THIỆU
y
C/C++
hổ
trợ
2
hệ
thống
nhập
xuất
:
y
C/C++
hổ
trợ
2
hệ
thống
nhập
xuất
:
− Mộthệ thống thừakế từ ngôn ngữ C
ộ
ệ
ố
ậ
ấ
ớ
ố
− M
ộ
th
ệ
th
ố
n
g
nh
ậ
pxu
ấ
thư
ớ
n
g
đ
ố
itượn
g
của C++.
2. Streams và Files
y
Hệ
thống
nhập
xuất
của
C
Hệ
thống
nhập
xuất
của
C
− Cung cấpmột giao diện(
interface
)nhất
quán
độc
lập
với
thiết
bị
thật
sự
mà
quán
độc
lập
với
thiết
bị
thật
sự
mà
chương trình tương tác.
cung
cấp
một
mức
độ
trừu
tượng
giữa
lập
−
cung
cấp
một
mức
độ
trừu
tượng
giữa
lập
trình viên và thiếtbị nhậpxuất. Sự trừu
tượng
này
được
gọi
là
stream
và
thiết
bị
tượng
này
được
gọi
là
stream
và
thiết
bị
thậtsựđượcgọilàfile.
3. Streams (dòng nhậpxuất)
y
Hệ
thống
file
của
C
được
thiết
kế
để
làm
Hệ
thống
file
của
C
được
thiết
kế
để
làm
việcvớinhiềuloạithiếtbị khác nhau như
terminals
(
thiết
bị
đầu
cuối
),
các
loại
ổ
đĩa
,
terminals
(
thiết
bị
đầu
cuối
),
các
loại
ổ
đĩa
,
băng từ,
y
Hệ
thống
file
chuyển
đổi
mỗi
loại
thành
một
y
Hệ
thống
file
chuyển
đổi
mỗi
loại
thành
một
thiếtbị logic gọilàstream. Tấtcả stream
có
cùng
hành
vi
có
cùng
hành
vi
3. Streams (dòng nhậpxuất)
y
Stream
độc
lập
với
thiết
bị
nên
cùng
một
Stream
độc
lập
với
thiết
bị
nên
cùng
một
hoạt động trên stream như ghi vào mộttập
tin
trên
đĩa
cũng
có
thể
dùng
để
ghi
vào
loại
tin
trên
đĩa
cũng
có
thể
dùng
để
ghi
vào
loại
thiếtbị khác như console (
màn hình
).
y
Có
hai
loại
stream
:
y
Có
hai
loại
stream
:
− Vănbản(
text
)
h
hâ
(
b
)
− N
h
ị p
hâ
n
(
b
inar
y
)
.
3.1. Text Streams
y
Một
text
stream
là
một
chuổi
các
ký
tự
.
Một
text
stream
là
một
chuổi
các
ký
tự
.
Trong mộttextstream,mộtsố ký tự có thể
bị
chuyển
đổi
tùy
thuộc
môi
trường
.
bị
chuyển
đổi
tùy
thuộc
môi
trường
.
y Ví dụ,kýtự newline ('\n') có thể bịđổi
thành
cặp
ký
tự
carriage
return/linefeed
(
ký
thành
cặp
ký
tự
carriage
return/linefeed
(
ký
tự xuống dòng và vềđầudòng
).
3.1. Text Streams
y
Không
có
quan
hệ
một
-
một
giữa
các
ký
tự
Không
có
quan
hệ
một
một
giữa
các
ký
tự
đượcviết(hayđọc) và những ký tự trên các
thiết
bị
ngoài
.
Do
đó
số
ký
tự
được
viết
(hay
thiết
bị
ngoài
.
Do
đó
số
ký
tự
được
viết
(hay
đọc) có thể khác số số ký tự trên thiếtbị
ngoài
.
ngoài
.
3.2. Binary Streams
y
Một
binary
stream
là
một
chuổi
bytes
Một
binary
stream
là
một
chuổi
bytes
tương ứng một-mộtvớichuổibytestrên
thiết
bị
ngoài
.
Nghĩa
là
không
có
sự
chuyển
thiết
bị
ngoài
.
Nghĩa
là
không
có
sự
chuyển
đổixảyra.Dođó, số bytes đượcviết(hay
đọc
)
thì
bằng
với
số
bytes
trên
thiết
bị
đọc
)
thì
bằng
với
số
bytes
trên
thiết
bị
ngoài.
4. FILES
y
Một
file
có
thể
là
một
tập
tin
trên
đĩa
,
một
Một
file
có
thể
là
một
tập
tin
trên
đĩa
,
một
terminal, hay máy in.
y
Để
tạo
kết
nối
(
associate
)
giữa
một
stream
y
Để
tạo
kết
nối
(
associate
)
giữa
một
stream
vớimột file ta dùng hoạt động mở (
open
).
Khi
file
được
mở
thông
tin
có
thể
được
trao
y
Khi
file
được
mở
,
thông
tin
có
thể
được
trao
đổigiữafilevàchương trình.
4. FILES
y
Không
phải
tất
cả
file
đều
có
cùng
khả
năng
Không
phải
tất
cả
file
đều
có
cùng
khả
năng
như nhau.
y
Ví
dụ
một
tập
tin
trên
đĩa
(
file
)
có
thể
hỗ
y
Ví
dụ
,
một
tập
tin
trên
đĩa
(
file
)
có
thể
hỗ
trợ truy xuấtngẫu nhiên trong khi đómáyin
(
cũng
là
file)
thì
không
thể
(
cũng
là
file)
thì
không
thể
.
y
“Tấtcả stream là như nhau nhưng file
thì
không
"
thì
không
"
.
4. FILES
y
Để
ngắt
kết
nối
giữa
một
stream
với
một
file
Để
ngắt
kết
nối
giữa
một
stream
với
một
file
ta dùng hoạt động đóng (
close
). Nếu đóng
một
file
đang
mở
cho
xuất
(
output
)
thì
nội
một
file
đang
mở
cho
xuất
(
output
)
thì
nội
dung củastreamtương ứng đượcviếtra
thiết
bị
ngoài
.
thiết
bị
ngoài
.
y Qúa trình này đượcgọi là flushing và đảm
bảo
là
không
có
thông
tin
bị
để
lại
trong
bảo
là
không
có
thông
tin
bị
để
lại
trong
vùng đệm(
buffer
).
4. FILES
y
Tất
cả
file
được
tự
động
đóng
khi
chương
Tất
cả
file
được
tự
động
đóng
khi
chương
trình mở chúng kếtthúcbìnhthường. Files
không
được
đóng
khi
chương
trình
mở
không
được
đóng
khi
chương
trình
mở
chúng bị kếtthúcbấtthường như bị treo
(
halt
)
hay
khi
chương
trình
thực
hiện
hàm
(
halt
)
hay
khi
chương
trình
thực
hiện
hàm
abort().
y
Mỗi
stream
liên
đới
với
một
file
có
một
cấu
y
Mỗi
stream
liên
đới
với
một
file
có
một
cấu
trúc kiểuFILE.
4.1. Cơ bảnvề hệ thống file
Các
hàm
liên
quan
đến
file
trong
thư
viện
stdio h
Tên hàm Chứcnăng
ê
à
ứ
Các
hàm
liên
quan
đến
file
trong
thư
viện
stdio
.
h
T
ê
nh
à
mCh
ứ
cnăn
g
fopen( ) Mở một file
fclose( ) Đóng một file.
putc(
)
Viết
một
ký
tự
đến
một
file
putc(
)
Viết
một
ký
tự
đến
một
file
.
fputc( ) Giống như putc() .
4.1. Cơ bảnvề hệ thống file
Tên
Chức
năng
Tên
hàm
Chức
năng
getc
(
)
Đọc
một
ký
tự
từ
một
file
getc
(
)
Đọc
một
ký
tự
từ
một
file
.
fgetc( ) Giống như getc() .
fgets( ) Đọcmộtchuổitừ một file.
fputs(
)
Viết
một
chuổi
đến
một
file
fputs(
)
Viết
một
chuổi
đến
một
file
.
fseek( ) Tìm mộtbytetrongmột file.
4.1. Cơ bảnvề hệ thống file
Tên Chứcnăng
hàm
ftell( ) Trả về vị trí hiệnhànhcủacủa file
idi t
i
n
di
ca
t
o
r
.
feof( )
Trả về true nếuduyệt đếncuối file (end-of-file).
f
(
)
T ả
ề
ế
ộ
lỗi
ả
f
error
(
)
T
r
ả
v
ề
true n
ế
um
ộ
t
lỗi
x
ả
yra.
rewind( ) Đưaindicatorvềđầu.
remove( ) Xóa một file.
fflush
(
)
Xả
hết
vùng
đệm
của
file
.
fflush
(
)
Xả
hết
vùng
đệm
của
file
.
4.2. Con trỏ file (
File pointer
)
y
Con
trỏ
file
là
một
cấu
trúc
kiểu
FILE,
trỏ
Con
trỏ
file
là
một
cấu
trúc
kiểu
FILE,
trỏ
đếnthôngtinvề file như tên file, trạng thái,
và
vị
trí
hiện
hành
của
file
.
và
vị
trí
hiện
hành
của
file
.
y Con trỏ file được dùng bởistreamtương
ứng
để
thực
hiện
các
hoạt
động
nhập
xuất
ứng
để
thực
hiện
các
hoạt
động
nhập
xuất
trên file.
Cú
pháp
khai
báo
:
y
Cú
pháp
khai
báo
:
FILE *fp;
4.3. Mở file
y
Hàm
fopen
()
mở
một
stream
và
liên
kết
Hàm
fopen
()
mở
một
stream
và
liên
kết
một file vớistreamđó. Hàm trả về mộtcon
trỏ
file
trỏ
đến
tập
tin
được
mở
.
trỏ
file
trỏ
đến
tập
tin
được
mở
.
y Cú pháp:
FILE *fopen(const char *filename, const char *mode);
y filename: chứatên/đường dẫncủa file
y mode: cho biếtmở file theo mode nào.
4.3. Mở file
y
Các
mode
để
mở
tập
tin
Các
mode
để
mở
tập
tin
− "r" Nếutậptinđượcmở thành công, hàm
fopen
()
nạp
nó
vào
bộ
nhớ
và
trả
về
con
fopen
()
nạp
nó
vào
bộ
nhớ
và
trả
về
con
trỏ trỏđếnkýtựđầutiêncủatậptin.
Ngược
lại
hàm
fopen
()
trả
về
NULL
Ngược
lại
,
hàm
fopen
()
trả
về
NULL
− "w" Nếutậptin tồntại, nội dung củanó
sẽ
bị
ghi
đè
sẽ
bị
ghi
đè
4.3. Mở file
• "
a
"
N
ế
u
t
ậ
p
tin
đ
ượ
c
m
ở
thành
công
hàm
a
N
ế
u
t
ậ
p
tin
đ
ượ
c
m
ở
thành
công
hàm
fopen() nạpnóvàobộ nhớ và trả về con trỏ trỏ
đ
ế
n
ký
t
ự
cu
ố
i
cùng
c
ủ
a
t
ậ
p
tin
.
N
ế
u
t
ậ
p
tin
đ
ế
n
ký
t
ự
cu
ố
i
cùng
c
ủ
a
t
ậ
p
tin
.
N
ế
u
t
ậ
p
tin
không tồntại, mộttậptinmới đượctạo. Trả về
NULL
n
ế
u
không
th
ể
m
ở
t
ậ
p
tin
.
NULL
n
ế
u
không
th
ể
m
ở
t
ậ
p
tin
.
• "r+" Nếutậptinđượcmở thành công, hàm
fopen
()
n
ạ
p
nó
vào
trong
b
ộ
nh
ớ
Tr
ả
v
ề
NULL
fopen
()
n
ạ
p
nó
vào
trong
b
ộ
nh
ớ
.
Tr
ả
v
ề
NULL
nếu không thể mở tậptin.
4.3. Mở file
y "
a
+"
N
ế
u
t
ậ
p
tin
đ
ượ
c
m
ở
thành
công
,
hàm
a
N
ế
u
t
ậ
p
tin
đ
ượ
c
m
ở
thành
công
,
hàm
fopen() nạpnóvàobộ nhớ và trả về con trỏ trỏ
đ
ế
n
ký
t
ự
đ
ầ
u
tiên
c
ủ
a
t
ậ
p
tin
.
N
ế
u
t
ậ
p
tin
không
đ
ế
n
ký
t
ự
đ
ầ
u
tiên
c
ủ
a
t
ậ
p
tin
.
N
ế
u
t
ậ
p
tin
không
tồntại, mộttậptinmới đượctạo. Trả về NULL
n
ế
u
không
th
ể
m
ở
t
ậ
p
tin
.
n
ế
u
không
th
ể
m
ở
t
ậ
p
tin
.
y Các hoạt động có thể làm trên tậptin:đọc, ghi
thêm
n
ộ
i
dung
m
ớ
i
vào
cu
ố
i
t
ậ
p
tin
Không
th
ể
thêm
n
ộ
i
dung
m
ớ
i
vào
cu
ố
i
t
ậ
p
tin
.
Không
th
ể
sửa đổinội dung đang có trong tậptin.
4.3. Mở file
y
Ví
dụ
:
Ví
dụ
:
FILE *fp;
if((
fp
fopen
("
test txt" "w
")) NULL)
if((
fp
=
fopen
("
test
.
txt"
,
"w
"))
==
NULL)
{
cout << "Cannot open file";
exit(1);
exit(1);
}
4.4. Đóng file
y
Hàm
fclose
()
đóng
stream
được
mở
bởi
hàm
Hàm
fclose
()
đóng
stream
được
mở
bởi
hàm
fopen(). Khi hàm đượcgọi, nó sẽ viếtbấtkỳ
dữ
liệu
nào
vẫn
còn
trong
buffer
đến
file
rồi
dữ
liệu
nào
vẫn
còn
trong
buffer
đến
file
rồi
đóng file.
y
Cú
pháp
:
y
Cú
pháp
:
f
là
ỏ
fil
ả
ề
b
ở
i
hà
f
()
int fclose(FILE *fp);
−
f
p:
là
con
tr
ỏ
fil
e
tr
ả
v
ề
b
ở
i
hà
m
f
open
()
.
4.5. Ghi mộtkýtựđếnmột file
y
Có
hai
hàm
xuất
ký
tự
đến
file
là
putc
()
và
Có
hai
hàm
xuất
ký
tự
đến
file
là
putc
()
và
fputc(). Hai hàm này là tương đương nhau.
Hàm
putc
()
ghi
một
ký
tự
đến
một
file
đã
Hàm
putc
()
ghi
một
ký
tự
đến
một
file
đã
đượcmở bởihàmfopen().
y
Cú
pháp
:
y
Cú
pháp
:
f
là
ỏ
fil
ả
ề
b
ở
i
hà
f
()
int putc(int ch, FILE *fp);
−
f
p
là
con
tr
ỏ
fil
e
tr
ả
v
ề
b
ở
i
hà
m
f
open
()
− ch là ký tự đượcviết đến file.
VD: đọckýtự từ bàn phím và ghi vào file đếnkhigặpkt$
void main
()
()
{
FILE *fp; char ch;
if((fp=fopen(“test.txt”, "w"))==NULL)
{ cout << "Cannot open file.\n";
exit(1);
}
do {
ch = getchar();//đọctừ bàn phím
putc(ch, fp);//ghi vào file
}while (ch != '$');
fclose(fp);//đóng file
}
4.6. Đọcmộtkýtự từ một file
y
Hàm
để
đọc
một
ký
tự
từ
file
:
getc()
và
y
Hàm
để
đọc
một
ký
tự
từ
file
:
getc()
và
fgetc()
Đ
ỗi
lầ
ột
ký
tự
từ
fil
đượ
ở
bởi
−
Đ
ọcm
ỗi
lầ
nm
ột
ký
tự
từ
fil
e
đượ
cm
ở
bởi
hàm fopen() ở chếđộđọc(read).
ú
á
ÙC
ú
ph
á
p: int
g
etc(FILE *fp);
Ùf
p
là con trỏ file kiểuFILE.
p
− Hàm trả về mã ascii củakýtựđược đọc,
trả
về
EOF
nếu
một
lỗi
xảy
ra
.
trả
về
EOF
nếu
một
lỗi
xảy
ra
.