File nhị phân (file có cấu trúc)

Một phần của tài liệu Làm quen với ngôn ngữ C (Trang 56 - 61)

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); } (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

#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(); }

Một phần của tài liệu Làm quen với ngôn ngữ C (Trang 56 - 61)