[r]
(1)Lập trình nâng cao - Chương 09 - Ngô Công Thắng
Ch
ươ
ng Ki
ể
u d
ữ
li
ệ
u t
ệ
p
I Giới thiệu tệp II Tệp nhị phân III Tệp văn
IV Truy nhập trực tiếp phần tử tệp V Tệp không xác định kiểu liệu
I Gi
ớ
i thi
ệ
u v
ề
t
ệ
p
1 Khái niệm tệp Cấu trúc tệp Phân loại tệp
(2)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng
1 Khái ni
ệ
m v
ề
t
ệ
p
l Kiểu tệp bao gồm tập hữu hạn phần tử có kiểu liệu lưu trữ nhớ
l Số phần tử tệp không cần xác định khai báo biến tệp
l Các phần tử tệp lưu trữ nhớ Đây đặc điểm khác với tất kiểu liệu khác
2 C
ấ
u trúc c
ủ
a t
ệ
p
l Các phần tử tệp xếp thành
dãy byte liên tiếp Sau phần tử liệu
cuối phần tử EOF Phần tử không
phải liệu mà mã kết thúc tệp
EOF
45 12 20 25 15 72 81
0 10 12 14 16
Vị trí byte
Con trỏ vị
(3)Lập trình nâng cao - Chương 09 - Ngô Công Thắng
3 Phân lo
ạ
i t
ệ
p
l Dựa vào cách lưu trữ liệu tệp ta có loại tệp sau:
§ Tệp nhị phân (binary): Dữ liệu ghi tệp nhị
phân có dạng byte nhị phân giống
trong nhớ
§ Tệp văn (text): Dữ liệu ghi tệp
thành ký tự bảng mã ASCII Trên
tệp văn có mã xuống dòng gồm ký tự
LF (mã 10) CR (mã 13)
4 Khai báo t
ệ
p
l Kiểu tệp trình biên dịch định nghĩa với tên chuẩn FILE
l Khai báo tệp ta khai báo biến trỏ trỏ tới kiểu FILE
Ví dụ: FILE *f;
(4)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng
II T
ệ
p nh
ị
phân
1 Ghi liệu tệp nhị phân Đọc liệu từ tệp nhị phân
1 Ghi d
ữ
li
ệ
u t
ệ
p nh
ị
phân
l B1: Mở tệp để ghi hàm fopen()
fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp khai báo trỏ tới kiểu FILE;
(5)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng
Các ki
ể
u truy nh
ậ
p t
ệ
p nh
ị
phân
Kiểu Ý nghĩa“wb” Mở tệp để ghi theo kiểu nhị phân Nếu tệp có bị xóa
“rb” Mở tệp để đọc theo kiểu nhị phân Nếu tệp khơng có sinh lỗi
“ab” Mở tệp theo kiểu nhị phân để ghi bổ sung vào cuối tệp Nếu tệp chưa có tạo tệp
“r+b” Mở tệp để đọc/ghi theo kiểu nhị phân Nếu tệp khơng có sẽsinh lỗi
“w+b” Mởtệp để đọc/ghi theo kiểu nhị phân Nếu tệp có bị xóa
“a+b” Mở tệp theo kiểu nhị phân để đọc/ghi bổ sung vào cuối tệp Nếu tệp chưa có tạo tệp
1 Ghi d
ữ
li
ệ
u t
ệ
p nh
ị
phân (ti
ế
p)
l B2: Ghi liệu tệp hàm fwrite()
fwrite(ptr, size, n, fp);
trong đó: +) ptr trỏ trỏ tới vùng nhớ chứa phần tử liệu cần ghi
+) size kích thước phần tử theo byte +) n số phần tử cần ghi
+) fp trỏ tệp
Nếu có lỗi khơng ghi được, hàm trả Nếu khơng có lỗi hàm trả số phần tử ghi
Ví dụ:
FILE *fp = fopen(“songuyen.dat”,”wb”); int a=200;
(6)Lập trình nâng cao - Chương 09 - Ngơ Công Thắng 11
1 Ghi d
ữ
li
ệ
u t
ệ
p nh
ị
phân (ti
ế
p)
l B3: Đóng tệp
fclose(fp);
trong fp trỏ tệp Ví dụ:
fclose(fp);
2
Đọ
c d
ữ
li
ệ
u t
ừ
t
ệ
p nh
ị
phân
l B1: Mở tệp để đọc hàm fopen()
fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp khai báo trỏ tới kiểu FILE;
(7)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng 13
2
Đọ
c d
ữ
li
ệ
u t
ừ
t
ệ
p nh
ị
phân (ti
ế
p)
l B2: Đọc liệu từ tệp hàm fread()
fread(ptr, size, n, fp);
trong đó: +) ptr trỏ trỏ tới vùng nhớ chứa
các phần tử liệu đọc
+) size kích thước phần tử theo byte
+) n số phần tử cần đọc
+) fp trỏ tệp
Hàm fread đọc n phần tử tệp kể từ vị trí
trỏ vị Hàm trả số phần tử đọc
2
Đọ
c d
ữ
li
ệ
u t
ừ
t
ệ
p nh
ị
phân (ti
ế
p)
l B2: Đọc liệu từ tệp hàm fread()
fread(ptr, size, n, fp);
Nếu trỏ vị cuối tệp (EOF) mà đọc sinh lỗi
Trước đọc tệp cần kiểm tra trỏ vị cuối tệp chưa => dùng hàm feof(con trỏ tệp)
(8)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng 15
2
Đọ
c d
ữ
li
ệ
u t
ừ
t
ệ
p nh
ị
phân (ti
ế
p)
l B3: Đóng tệp
fclose(fp);
trong fp trỏ tệp Ví dụ:
fclose(fp);
Ví d
ụ
Viết chương trình tạo tệp “sonuyen.dat” chứa n số nguyên nhập vào từ bàn phím
Đọc lại số nguyên từ tệp đưa hình
BTVN: Tạo tệp nhị phân mathang.bin chứa thông tin n mặt hàng, mặt hàng có thơng tin tên hàng, số lượng, đơn giá
(9)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 17
III T
ệ
p v
ă
n b
ả
n
1 Ghi liệu tệp văn
2 Đọc lại liệu từ tệp văn
1 Ghi d
ữ
li
ệ
u t
ệ
p v
ă
n b
ả
n
B1: Mở tệp để ghi hàm fopen()
fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp khai báo trỏ tới kiểu FILE;
(10)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 19
Các ki
ể
u truy nh
ậ
p t
ệ
p v
ă
n b
ả
n
Kiểu Ý nghĩa“wt” Mở tệp để ghi theo kiểu văn Nếu tệp có bị xóa
“rt” Mở tệp để đọc theo kiểu văn Nếu tệp khơng có sinh lỗi
“at” Mở tệp theo kiểu văn để ghi bổ sung vào cuối tệp Nếu tệp chưa có sẽtạo tệp
“r+t” Mởtệp để đọc/ghi theo kiểu văn Nếu tệp khơng có sinh lỗi
“w+t” Mởtệp để đọc/ghi theo kiểu văn Nếu tệp có bị xóa
1 Ghi d
ữ
li
ệ
u t
ệ
p v
ă
n b
ả
n (ti
ế
p)
B2: Ghi liệu tệp văn
- Ghi liệu theo định dạng tệp văn giống
như đưa liệu hình
fprintf(fp,dk,…);
trong đó: +) fp trỏ tệp
+) dk xâu ký tự có chứa đặc tả chuyển
dạng liệu
+) … đối mà giá trị chúng cần ghi tệp
(11)Lập trình nâng cao - Chương 09 - Ngơ Công Thắng 21
1 Ghi d
ữ
li
ệ
u t
ệ
p v
ă
n b
ả
n (ti
ế
p)
B2: Ghi liệu tệp văn
- Ghi xâu ký tự tệp văn
fputs(s,fp); đó: +) fp trỏ tệp
+) s xâu biến xâu
Hàm fputs() không ghi ký tự ‘\0’ tệp Ví dụ: fputs(“Hung Yen”,fp);
1 Ghi d
ữ
li
ệ
u t
ệ
p v
ă
n b
ả
n (ti
ế
p)
B3: Đóng tệp
(12)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 23
2
Đọ
c l
ạ
i d
ữ
li
ệ
u t
ừ
t
ệ
p v
ă
n b
ả
n
B1: Mở tệp để đọc hàm fopen() fp = fopen(Tên tệp, Kiểu truy nhập);
trong đó: +) fp trỏ tệp khai báo trỏ tới kiểu FILE;
+) Tên tệp xâu biến xâu Trong tên tệp có đường dẫn +) Kiểu truy nhập tệp xâu diễn tả cách truy nhập vào tệp Ở ta dùng “rt”
2
Đọ
c l
ạ
i d
ữ
li
ệ
u t
ừ
t
ệ
p v
ă
n b
ả
n (
ti
ế
p
)
B2: Đọc lại liệu từ tệp
- Đọc liệu có định dạng
fscanf(fp, dk, …)
trong đó: +) fp trỏ tệp
+) dk xâu ký tự có chứa đặc tả chuyển dạng liệu
+) … địa vùng nhớ chứa liệu
đọc
(13)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 25
2
Đọ
c l
ạ
i d
ữ
li
ệ
u t
ừ
t
ệ
p v
ă
n b
ả
n (
ti
ế
p
)
B2: Đọc lại liệu từ tệp
- Đọc xâu ký tự từ tệp
fgets(s, n, fp); đó: +) s biến xâu ký tự
+) n kích thước biến xâu, hàm đọc tối
đa n-1 ký tự từ tệp, thêm ký tự ‘\0’ vào xâu +) fp trỏ tệp
Ví dụ: fgets(s, sizeof(s), fp);
2
Đọ
c l
ạ
i d
ữ
li
ệ
u t
ừ
t
ệ
p v
ă
n b
ả
n (
ti
ế
p
)
B3: Đóng tệp
(14)Ví d
ụ
1) Viết chương trình tạo tệp văn 'baitho.txt' chứa n câu thơ Đọc lại thơ từ tệp đưa hình
2) Cho tệp văn input.txt chứa tọa độ điểm A B mặt phẳng Đọc tọa độ điểm tính khoảng cách AB Ghi kết tệp kq.txt
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 27
IV Truy nh
ậ
p tr
ự
c ti
ế
p ph
ầ
n t
ử
c
ủ
a t
ệ
p
1 Các hàm di chuyển trỏ vị
(15)Lập trình nâng cao - Chương 09 - Ngô Công Thắng 29
1 Các hàm di chuy
ể
n tr
ỏ
ch
ỉ
v
ị
l Hàm rewind(fp) chuyển trỏ vị phần tử
đầu tiên tệp, fp trỏ tệp
l Hàm fseek(fp, sb, xp)
trong đó: +) fp trỏ tệp
+) sb số byte cần di chuyển
+) xp vị trí xuất phát xp nhận
trong giá trị sau:
SEEK_SET 0: xuất phát từ đầu tệp
SEEK_CUR 1: xuất phát từ vị trí
con trỏ vị
SEEK_END 2: Xuất phát từ cuối tệp
1 Các hàm di chuyển trỏ vị (tiếp)
Hàm fseek() di chuyển trỏ vị tệp fp từ vị trí xác định xp qua số byte sb Chiều di chuyển cuối tệp sb dương, đầu tệp sb âm
Hàm trả di chuyển thành công, trả giá trị khác không di chuyển không thành công
(16)Lập trình nâng cao - Chương 09 - Ngơ Công Thắng 31 Các hàm di chuyển trỏ vị (tiếp)
l Hàm ftell(fp) cho biết vị trí trỏ vị
Ứng dụng: 1) Xác định kích thước tệp 2) Xác định số phần tử tệp
EOF
20 15 10
0
2 Truy nh
ậ
p m
ộ
t ph
ầ
n t
ử
b
ấ
t k
ỳ
c
ủ
a t
ệ
p
B1: Mở tệp với kiểu truy nhập “r+b”
B2: Di chuyển trỏ vị tới phần tử cần
đọc/ghi
(17)Lập trình nâng cao - Chương 09 - Ngơ Cơng Thắng 33
3 M
ộ
t s
ố
hàm thao tác t
ệ
p
l Hàm fcloseall() đóng tất tệp mở
l Hàm fflush(con trỏ tệp) làm vùng đệm tệp
l Hàm fflushall() làm vùng đệm tất
các tệp mở
l Hàm ferror(con trỏ tệp) kiểm tra lỗi thao tác tệp,
nếu khơng có lỗi trả 0, có lỗi trả giá trị
khác
l Hàm remove(Tên tệp) xóa tệp
l Hàm rename(Tên tệp cũ, Tên mới);
Ví d
ụ
1) Cho tệp nhị phân chứa phần tử số nguyên Thay phần tử thứ k giá trị x nhập vào từ bàn phím (1 <= k <= n, n số phần tử tệp)
(18)Bài t
ậ
p
1) Nhập vào n mặt hàng, mặt hàng có thơng tin tên hàng, số lượng, đơn giá Lưu n mặt hàng tệp nhị phân mathang.dat Đọc lại tệp, tính tổng tiền n mặt hàng
Lập trình nâng cao - Chương 09 - Ngô Công Thắng 35
V-T
ệ
p không xác
đị
nh ki
ể
u
l Coi tất liệu byte nhị phân