Khi ghi “ biến có cấu trúc ” lên file ghi một khối có kích thước cố định Và đọc từ file ra biến cấu trúc , cũng đọc từ file theo khối có kích thước. cố định.[r]
Trang 1Tin
Tin Học Học Cơ Cơ Sở Sở 4: 4:
Tập
Tin
Tin Học Học Cơ Cơ Sở Sở 4: 4:
Tập
Vũ Thị Hồng Nhạn
(vthnhan@vnu.edu.vn) Human Machine Interaction Lab Vietnam National Univ., Hanoi
Trang 2Nội dung
Sử dụng tập tin (file)
Mở, đóng file
Ghi, đọc file với số nguyên, mảng, chuỗi
Ghi, đọc file với số nguyên, mảng, chuỗi
Kết luận
Trang 3Dòng (streams)
Trong nhiều ngôn ngữ lập trình, vào/ra (input/output) được thực
hiện trên dòng dữ liệu
Dữ liệu tồn tại trên dòng, ta có thể truy cập và sử dụng theo nhu cầu
Ví dụ
stdout: dòng xuất ra chuẩn
stderr: dòng ra xuất ra lỗi chuẩn
stdin: dòng nhập vào chuẩn
files
network sockets (kết nối mạng: network connections)
Trang 4Dữ liệu thường được lưu trong các file và đây cũng là nguồn dữ liệu cho chương trình
Dữ liệu nhập vào
• Trực tiếp từ bàn phím
Xuất dữ liệu
• Màn hình
Chương trình
• Trực tiếp từ bàn phím
• File trên đĩa
• Kho dữ liệu trên mạng
…
• Màn hình
• File lưu trên đĩa
• Máy in
…
Chương trình (program)
Trang 5Cơ bản về file
Dữ liệu biểu diễn theo cách của user (vd Số 12) được lưu trong các file
Dưới dạng nhị phân (1100)
Trường hợp lưu trữ chuẩn không có mã hóa
ASCII Symbol 64
65 66 67 68
@ A B C D
Ký tự: mã ASCII
Chuỗi ký tự: chuỗi mã ASCII của từng ký tự
Số: chuỗi mà ASCII của ký tự số hoặc biểu diễn nhị phân của số
Đặ c điểm truy xuất data trong tập tin
Tuần tự từng byte
68 69 70
….
D E F
….
Trang 6Cơ bản về file (tiếp)
Hệ điều hành xác định 1 file bằng “đường dẫn”
Đó là một chuỗi các ký tự
Đườ ng dẫn tuyệt đối ( absolute path ), ví dụ,
C:\\folder1\folder2\dulieu.txt
Nếu file nằm trong thư mục hiện hành
Chỉ cần khai báo “tên file” là đủ: “dulieu.txt”
Gọi là “đường dẫn tương đối” (relative path)
Trang 7Phân loại files
Tập tin văn bản (text file)
Dữ liệu lưu trữ là mã ASCII của ký tự , ký số
Tập tin nhị phân (binary file)
Dữ liệu lưu trữ là dạng nhị phân của ký tự
Trang 8Phân loại files (tiếp)
Hai loại lưu trữ khác nhau nên việc truy xuất dữ liêu….
từ file ra biến cần đến các hàm thư viện khác nhau
Binary file
Dùng để lưu trữ dữ liệu dưới dạng cấu trúc có kích thước cố định
Khi ghi “biến có cấu trúc” lên file ghi một khối có kích thước cố định
Và đọc từ file ra biến cấu trúc, cũng đọc từ file theo khối có kích thước
cố định
Trang 9Vào/ra file
Trước khi có thể Đọc & Ghi được
Phải mở file, dùng hàm thư viện fopen
fopen nhận một tên ngoài như “data.txt”, thực hiện các thủ tục với hệ điều hành và trả lại một “con trỏ”
Ta dùng con trỏ này để đọc và ghi vào file
Con trỏ “trỏ tới” một structure FILE
FILE *fp
Trang 10FILE *fopen(char *name, char *mode);
fopen trả lại con trỏ trỏ tới FILE
FILE là tên kiểu
mode có thể là
r: đọc (read)
w: ghi (write)
a: thêm vào (append)
Có thể thêm “b” vào chuỗi mode, cho phép làm việc với file nhị phân
Trang 11Đóng file: fclose
int fclose(FILE *fp);
0: được trả lại nếu thành công
EOF (hằng -1) nếu thất bại
Ví dụ Kiểm tra xem file có tồn tại không
int FileExist (char *fname){
FILE* fp = fopen(fname, “r”);
int kq;
kq = (fp==NULL)? 0 : 1;
if (fp)
fclose(fp);
Trang 12Ví dụ 1
Ghi và đọc số nguyên từ 1…n
int main(){
FILE *fp;
int i,n;
printf(“Nhập vào số n:");
scanf("%d", &n);
//Ghi file
fp = fopen("data.txt","wb");
if(fp= =NULL){
printf(“Không thể mở tên file.\n");
exit(0);
}else
for(i=1;i<=n;i++)
fwrite(&i, sizeof(int), 1, fp); //Ghi file
fwrite(&i, sizeof(int), 1, fp); //Ghi file
fclose(fp);
//Đọc file
fp=fopen("data.txt", "rb");
while(fread(&i, sizeof(int),1, fp)==1) //Đọc file printf("%d ",i);
Trang 13fwrite, fread
fwrite(&i, sizeof(int), 1, fp)
Ghi thông tin i vào tập tin
Hàm có 4 đối số
Địa chỉ để ghi cấu trúc (&i)
Kích thước của cấu trúc (sizeof(int))
fread(&i, sizeof(int), 1, fp) =1 hoặc 0
Đọc thông tin từ tập tin lưu vào i
Đọc thành công hàm trả về 1, và 0 nếu kết thúc file
Kích thước của cấu trúc (sizeof(int))
Số cấu trúc sẽ ghi (1)
Con trỏ trỏ tới tập tin (fp)
size_t fread(void *array, size_t size, size_t count, FILE *fp);
size_t fwrite(void *array, size_t size, size_t count, FILE *fp);
Trang 14Ví dụ 2: ghi 1 danh sách nhân viên ra file
#define MAX 30
int main(){
typedef struct{
int manv;
char hoten[28];
printf(“Nhập vào số nhân viên: ");
scanf(“%d”,&n);
//Mở file để ghi nhân viên vào file char hoten[28];
}nhanvien;
FILE *fp;
nhanvien nv[MAX];
char temp[10];
//Mở file để ghi nhân viên vào file
fp=fopen("struct.dat","wb");
if(fp==NULL){
printf(“không mở được file!\n");
exit(0);
Trang 15Ví dụ 2 (tiếp)
//Ghi nhân viên vào file
for(i=0; i<n;i++){
fflush(stdin);
printf(“Nhập mã nhân viên thứ%d:", i+1);
scanf(“%d”, nv[i].manv );
fflush(stdin);
printf(“Nhập tên nhân viên:");
gets(nv[i].hoten);
fwrite(&nv[i],sizeof(nhanvien),1,fp);
Trang 16Ví dụ dụ 2 ( 2 (tiếp tiếp) ) Ví
Ví dụ dụ 2 ( 2 (tiếp tiếp) )
//Đọc từ file và in nhân viên ra màn hình
fp = fopen("struct.dat","rb");
while( fread(&nv[i], sizeof(nhanvien),1,fp) = =1)
printf("%5d %s\n“,nv[i].manv, nv[i].hoten);
printf("%5d %s\n“,nv[i].manv, nv[i].hoten);
}
fclose(fp);
}
Trang 17Kết luận
Ý nghĩa của việc sử dụng tập tin (file)
Mở, đóng file
Ghi, đọc file số nguyên, mảng, chuỗi