IV. Structure:
V.2. File nhị phân (file có cấu trúc)
File nhị phâ n là file dù ng đ ể lưu trữ cá c cấ u trú c dướ i dạ ng struct hoặ c union
V.2.1. Khai bá o:
FILE * fptr;
V.2.2. Mở file:
fptr = fopen (tê nfile, “kiể u”); . rb ( b: binary): mở chỉ đ ể đ ọ c
. wb : đ ể ghi. Nế u file đ∙ có thì xó a trướ c khi mở .
. ab : nố i thê m; mở đ ể ghi thê m và o cuối file, nế u file chưa có thì tạ o mớ i
. rb+ : mở file đ∙ có đ ể cậ p nhậ t (đ ọ c/ghi) . wb+ : tạ o file mớ i cho phép đ ọ c/ghi
V.2.3. Đó ng file:
fclose (fptr)
V.2.4. Đọ c/ghi file: Hà m fread : đ ọ c số mẫ u tin(cấ u trú c) trong file fptr
và o <biế n cấ u trú c>.
fread (& biế n cấ u trúc, sizeof (biế n cấ u trúc) , số cấ u trúc, fptr);
Hà m fread trả về số cấ u trú c đ ọ c đượ c
Hà m fwrite ghi dữ liệ u trong <biế n cấ u trú c> và o file fptr.
fwrite (&biế n cấ u trúc, sizeof (biế n cấ u trúc) , số cấ u trúc, fptr);
Hà m fwrite trả về số cấ u trú c ghi đượ c lê n file
Chú ý :
- Để kiể m tra việ c đọc file ta kiể m tra số cấ u trúc được đọc. Nế u số cấ u trúc trả về bằ ng 0 mà ta cầ n đ ọ c là 1 cấ u trú c thì đ iề u đ ó chứ ng tỏ đ∙ hế t file.
* Ghi mộ t mả ng cấ u trúc lê n file
fwrite(tê nmả ng, sizeof (tê nmả ng), 1, fptr);
⇔ for (i= 0; i< n; i++)
fwrite (&tê nmả ng[i], sizeof (tê nmả ng[i] , 1, fptr); Ví dụ 1: Chươ ng trì nh ghi lê n file nhị phâ n
#include <stdio.h> #include <stdlib.h> #include <string.h> void main() { struct hocvien { char hoten[30]; int tuoi; } hv; FILE *fptr; char tenfile[67]; char tuoi[3];
printf("Nhap ten file :"); gets(tenfile);
if ((fptr=fopen(tenfile,"wb")) == NULL) // mở file nhị phâ n đ ể ghi { printf ("Khong the tao file\n"); exit(0);
} do
gets(hv.hoten);
if (strlen(hv.hoten) !=0) { printf("Nhap tuoi :"); gets(tuoi);
hv.tuoi = atoi(tuoi); // macro doi chuoi qua so nguyen
fwrite(&hv, sizeof(hv), 1, fptr) ; // ghi noi dung 1 mau tin trong bien hv // vao file fptr } } while (strlen(hv.hoten)!=0); fclose (fptr); }
Ví dụ 2: Ghi dữ liệ u mả ng và o file nhị phâ n #include <stdio.h> #include <stdlib.h> #include <string.h> void main() { struct hocvien { char hoten[30]; int tuoi; } hv;
struct hocvien table[3]; FILE *fptr;
char tenfile[67]; char tuoi[3]; int i=0;
printf("Nhap ten file :"); gets(tenfile);
if ((fptr=fopen(tenfile,"wb")) == NULL) { printf ("Khong the tao file\n"); exit(0); }
do
{ printf("Nhap ho ten hoc vien :"); gets(hv.hoten);
printf("Nhap tuoi :"); gets(tuoi);
hv.tuoi = atoi(tuoi); // macro doi chuoi qua so nguyen table[i++]=hv;
}
while (i<3);
fwrite(table, sizeof(table), 1, fptr) ; // ghi noi dung toan bo hoc vien trong // table vao file fptr
// hoặ c for (i=0; i<3; i++)
// fwrite(&table[i], sizeof(table[i]), 1, fptr) fclose (fptr);
}
Ví dụ 3: Chươ ng trì nh đ ọ c file nhị phâ n, và in danh sá ch họ c viê n ra mà n hì nh. // In danh sá ch họ c viê n ra mà n hì nh #include <stdio.h> #include <stdlib.h> #include <conio.h> void main() { struct hocvien { char hoten[30]; int tuoi; } hv; FILE *fptr; char tenfile[67]; char tuoi[3];
printf("Nhap ten file :"); gets(tenfile);
if ((fptr=fopen(tenfile,"rb")) == NULL) // Mở file đ ể đ ọ c { printf ("Khong the mo file\n"); exit(0);
}
clrscr();
printf(" Ho va ten Tuoi");
while (fread(&hv,sizeof(hv),1,fptr) ==1) { printf("\n%-20s",hv.hoten); printf("%3d",hv.tuoi); } fclose (fptr); }
V.2.5. Truy xuấ t tậ p tin ngẫ u nhiê n: (đ iề u khiể n con trỏ tậ p tin trê n file
* Con trỏ file: Mỗ i tậ p tin đ ề u có con trỏ file sau khi đượ c mở . Con trỏ file là con trỏ chỉ đ ế n từ ng byte trê n file. Khi đ ọ c hay ghi dữ liệ u trê n tậ p tin, ta đ∙ là m dịch chuyể n con trỏ file một số byte, đâ y chí nh là số byte mà kiể u dữ liệ u đ∙ chiế m. Khi đ ó ng rồ i mở tậ p tin, con trỏ file luô n ở đ ầ u tậ p tin ; ngoạ i trừ trường hợ p ta mở bằ ng tù y chọ n 'a' thì con trỏ file sẽ ở cuố i tậ p tin đ ể ghi thê m dữ liệ u và o cuố i tậ p tin. Hà m fseek cho phép ta di chuyể n con trỏ file đ ế n vị trí mong muố n.
Cú phá p:
int fseek (FILE * fptr, long nbytes, kiể u)
+ nbytes : số bytes tí nh từ vị trí kiể u cho đ ế n vị trí cầ n tớ i + kiể u là số nguyê n :
kiể u = 0 (tí nh từ đ ầ u tậ p tin) kiể u = 1 (tí nh từ vị trí hiệ n tạ i) kiể u = 2 (tí nh từ cuố i tậ p tin)
Nế u fseek trả về 0 nghĩ a là nó đ∙ di chuyể n tớ i vị trí đ ó . Lưu ý : số thứ tự trê n tậ p tin tí nh từ 0.
Ví dụ : Viế t chươ ng trì nh truy xuấ t ngẫ u nhiê n mộ t mẫ u tin theo số thứ tự củ a nó trong file nhị phâ n
#include <stdio.h> #include <stdlib.h> #include <conio.h> void main() { struct hocvien { char hoten[30]; int tuoi; } hv; FILE *fptr; char tenfile[67]; int stt, sobytes;
printf("Nhap ten file :"); gets(tenfile);
if ((fptr=fopen(tenfile,"rb")) == NULL) { printf ("Khong the mo file\n"); exit(0); }
printf("Cho biet so thu tu mau tin can di chuyen den :"); scanf("%d",&stt);
sobytes = stt * sizeof(hv); if (fseek(fptr,sobytes,0)!=0)
{ printf ("Khong the di chuyen con tro file toi vi tri ban chi dinh duoc"); exit(0); } fread(&hv,sizeof(hv),1,fptr) ; printf("\n%-20s",hv.hoten); printf("%3d",hv.tuoi); fclose (fptr); getch(); }