Chương 6Tệ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.. Trên bộ nhớ ngoài dữ liệu
Trang 1Chươ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)
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”
Trang 2Tệ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ụ:
Trang 3Truy 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:
Trang 4Truy 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:
Trang 5Truy xuất file nhị phân (tt)
Hàm ftell:
Truy xuất file nhị phân (tt)