Xem mẫu
- BÀI GIẢNG HỌC PHẦN
KỸ THUẬT LẬP TRÌNH
CHƯƠNG 7: TỆP
- Nội dung
7.1. Khái niệm tệp
7.2. Tệp văn bản
7.3. Tệp nhị phân
2
- 7.1. Khái niệm tệp
• Tệp: là một tập hợp các dữ liệu cùng kiểu, có liên
quan với nhau, được nhóm lại với nhau thành một
dãy và thường được lưu trữ trên các thiết bị nhớ
ngoài dưới một tên gọi nào đó. Tệp tồn tại ngay cả
khi chương trình đã kết thúc hoặc tắt máy, thường
được lưu trữ để sử dụng lâu dài
• Khi khai báo biến tệp không cần xác định số phần
tử của tệp
• Khi lưu trữ, các phần tử của tệp được sắp xếp thành
một dãy các byte liên tiếp nhau, sau phần tử dữ liệu
cuối cùng là phần tử EOF (mã kết thúc tệp)
• 2 loại tệp: tệp văn bản, tệp nhị phân
3
- 7.2. Tệp văn bản
• Khai báo tệp văn bản
• Mở tệp văn bản
• Đóng tệp văn bản
• Đọc/ghi một ký tự với tệp văn bản
• Đọc/ghi theo kiểu văn bản
• Đọc/ghi một xâu ký tự
4
- Khai báo tệp văn bản
• Tệp văn bản:
- Lưu trữ dữ liệu dưới dạng ký tự
- Có 2 cách truy xuất theo kiểu ký tự:
+ Truy xuất theo từng ký tự
+ Truy xuất theo từng dòng
• Cú pháp khai báo biến tệp:
FILE *con_trỏ_tệp;
Ví dụ: FILE *fp;
5
- Mở tệp văn bản (1)
• Cú pháp:
con_trỏ_tệp = fopen("tên_tệp", "kiểu_truy_nhập");
- Hàm fopen nếu mở tệp thành công sẽ trả về con trỏ
tệp cho tệp được mở, nếu tệp cần mở không tồn tại
trên ổ đĩa thì hàm fopen trả về giá trị NULL
- "tên_tệp" có thể bao gồm cả đường dẫn đầy đủ tới
tệp
Ví dụ: "C:\SV\tepvanban.txt"
6
- Mở tệp văn bản (2)
• Cú pháp: (tiếp)
- "kiểu_truy_nhập" có thể nhận các giá trị sau:
"r" mở tệp để đọc, nếu tệp chưa tồn tại thì báo lỗi
"w" mở tệp mới để ghi, nếu tệp đã tồn tại sẽ bị xóa
"a" mở tệp để ghi bổ sung vào cuối tệp, nếu tệp
chưa tồn tại thì tạo tệp mới
"r+" mở tệp để cập nhật (đọc/ghi), nếu tệp chưa tồn
tại thì báo lỗi
"w+" mở tệp mới để đọc/ghi, nếu tệp đã tồn tại sẽ bị
xóa
"a+" mở tệp để đọc/ghi bổ sung vào cuối tệp, nếu
tệp chưa tồn tại thì tạo tệp mới
- Ví dụ:
fp = fopen("C:\SV\tepvanban.txt", "w");
7
- Đóng tệp văn bản
• Cú pháp:
fclose(con_trỏ_tệp);
- Các thao tác thực hiện:
+ Đẩy dữ liệu còn trong vùng đệm lên đĩa (khi đang
ghi)
+ Xóa vùng đệm (khi đang đọc)
+ Giải phóng biến con trỏ để nó có thể dùng cho tệp
khác. Nếu thành công hàm cho giá trị 0, trái lại hàm
cho EOF
• Ví dụ:
fclose(fp);
8
- Đọc/ghi một ký tự với tệp văn bản (1)
• Ghi ký tự vào tệp:
Có thể sử dụng 1 trong 2 hàm:
putc(ch, fp);
fputc(ch, fp);
trong đó: ch là một giá trị nguyên (coi là không
dấu), fp là con trỏ tệp
Hàm ghi lên tệp ký tự có mã bằng m = ch % 256
Nếu thành công hàm cho mã ký tự được ghi, nếu
không hàm cho EOF
Nếu m=10, hàm sẽ ghi lên tệp 2 mã 13 và 10
9
- Đọc/ghi một ký tự với tệp văn bản (2)
• Đọc ký tự từ tệp:
Có thể sử dụng 1 trong 2 hàm:
getc(fp);
fgetc(fp);
trong đó: fp là con trỏ tệp
Hàm đọc một ký tự từ tệp
Nếu thành công hàm cho mã ký tự đọc được (
[0,255], nếu gặp cuối tệp hoặc có lỗi thì hàm cho
EOF
Hàm đọc một lượt cả 2 mã 13 và 10 rồi trả về giá trị
10
Khi gặp mã 26 thì hàm trả về EOF
10
- Đọc/ghi theo kiểu văn bản (1)
• Ghi dữ liệu theo định dạng:
fprintf(fp,xâu_định_dạng, danh_sách_tham_số);
trong đó: fp là con trỏ tệp
Giá trị các tham số được ghi lên tệp theo định dạng
trong xâu_định_dạng
Nếu thành công hàm trả về giá trị nguyên bằng số
byte dữ liệu được ghi lên tệp, khi có lỗi thì hàm cho
EOF
11
- Đọc/ghi theo kiểu văn bản (2)
• Đọc dữ liệu theo định dạng:
fscanf(fp,xâu_định_dạng, danh_sách_tham_số);
trong đó: fp là con trỏ tệp
Đọc dữ liệu từ tệp, biến đổi theo định dạng và lưu
kết quả vào các tham số
Hàm trả về giá trị bằng số trường được đọc
12
- Đọc/ghi một xâu ký tự (1)
• Ghi một xâu ký tự vào tệp:
fputs(s,fp);
trong đó:
- s là con trỏ trỏ tới địa chỉ đầu của một xâu ký tự
kết thúc bằng ký tự '\0'
- fp là con trỏ tệp
Ghi xâu s lên tệp fp (không ghi ký tự '\0' vào tệp)
Nếu thành công hàm trả về ký tự cuối cùng được
ghi vào tệp, khi có lỗi thì hàm cho EOF
13
- Đọc/ghi một xâu ký tự (2)
• Đọc một xâu ký tự từ tệp:
fgets(s,n,fp);
trong đó:
- s là con trỏ (kiểu char) trỏ tới một vùng nhớ đủ
lớn để lưu xâu ký tự đọc được từ tệp
- n là số nguyên xác định độ dài cực đại của xâu
cần đọc
- fp là con trỏ tệp
Đọc một xâu ký tự từ tệp fp lưu vào vùng nhớ s
14
- Đọc/ghi một xâu ký tự (3)
• Đọc một xâu ký tự từ tệp: (tiếp)
Quá trình đọc kết thúc khi:
+ Hoặc đã đọc n-1 ký tự
+ Hoặc gặp dấu xuống dòng (cặp mã 13 10), khi đó
mã 10 được đưa vào xâu kết quả
+ Hoặc kết thúc tệp
Xâu kết quả được bổ sung thêm ký tự '\0'
Khi đọc thành công, hàm trả về địa chỉ vùng nhận
kết quả, nếu có lỗi hoặc đọc hết tệp thì hàm trả về
giá trị NULL
15
- Ví dụ (1)
• Chương trình đọc/ghi từng dòng văn bản:
#include
int main(void)
{
FILE *fp;
int i;
char s[256];
fp = fopen("vanban.txt","w");
16
- Ví dụ (2)
i=0;
while(1)
{
i++;
printf("Nhap dong thu %d
(nhan Enter de ket thuc):",i);
fflush(stdin);
gets(s);
if (s[0]=='\0') break;
if (i>1) fputc(10,fp);
fputs(s,fp);
}
fclose(fp);
17
- Ví dụ (3)
printf("Van ban da nhap la:\n");
fp = fopen("vanban.txt","r");
while (!feof(fp))
{
fgets(s,256,fp);
printf("%s",s);
}
fclose(fp);
return 0;
}
18
- 7.3. Tệp nhị phân
• Khai báo tệp nhị phân
• Mở tệp nhị phân
• Đóng tệp nhị phân
• Đọc/ghi một ký tự với tệp nhị phân
• Đọc/ghi một số nguyên
• Đọc/ghi một mẫu tin
• Truy cập ngẫu nhiên
19
- Khai báo tệp nhị phân
• Tệp nhị phân:
- Dùng để lưu trữ dữ liệu theo dạng “nhị phân”
• Cú pháp khai báo biến tệp: tương tự như tệp văn
bản
FILE *con_trỏ_tệp;
Ví dụ: FILE *fp;
20
nguon tai.lieu . vn