Ta đã biết hai hàm fprintffscanf để đọc, ghi dữ liệu từ một tệp văn bản. Trong trường hợp của tệp nhị phân ta cũng có hai hàm mới có cùng chức năng tương tự (đọc ghi tệp) khi thao tác với tệp nhị phân đó là hàm fwirtefread

1.Hàm fwirte ghi dữ liệu vào file nhị phân

Khi thao tác ghi với file nhị phân, ta hoàn toàn có thể ghi một biến, một mảng hay một kiểu cấu trúc vào file nhị phân đó thông qua việc sử dụng hàm fwirte.

Cú pháp:

fwrite(const void *ptr, size_t size, size_t n, FILE *fp);

Trong đó:

  • ptr trỏ đến khối bộ nhớ chứa các mục dữ liệu sẽ được ghi.
  • size chỉ định số byte của mỗi mục sẽ được ghi.
  • n số mục sẽ được viết.
  • fp là một con trỏ đến tệp nơi các mục dữ liệu sẽ được ghi.

Khi thực hiện thành công, hàm trên trả về số lượng các mục được ghi thành công vào tệp. Khi có lỗi sảy ra, nó trả về một số nhỏ hơn n.

Để hiểu rõ hơn, cũng xét các ví dụ sau tôi sẽ sử dụng ghi một biến, mảng và struct vào file nhị phân.

Ghi một biến vào file nhị phân:

#include<stdio.h>
int main () {
   //con tro file
   FILE *fp;
   float pi = 3.14;
   //mo file voi che do ghi nhi phan wb
   fp = fopen( "sopi.bin" , "wb" );
   //thuc hien ghi bien str vao file
   fwrite(&pi , 1 , sizeof(pi) , fp );
   //dong file
   fclose(fp);
}

Ghi một mảng vào file nhị phân:

#include<stdio.h>
int main () {
   //con tro file
   FILE *fp;
   int arr[5] = {101, 203, 303, 404, 505};
   //mo file voi che do ghi nhi phan wb
   fp = fopen( "soluong.bin" , "wb" );
   //thuc hien ghi mang arr vao file
   fwrite(arr, sizeof(arr), 1, fp);
   //dong file
   fclose(fp);
}

Ghi một struct vào file nhị phân

#include <stdio.h>
struct ngaysinh
{
   int ngay;
   int thang;
   int nam;
};
int main()
{
   struct ngaysinh n1;
   // con tro file
   FILE *fp;
   //mo file ngaysinh.bin voi che do mo nhi phan wb
   fp = fopen("ngaysinh.bin","wb");
   //them du lieu vao struct
   n1.ngay = 15;
   n1.thang = 9;
   n1.nam = 2021;
   //ghi du lieu 
   fwrite(&n1, sizeof(struct ngaysinh), 1, fp); 
   //dong file
   fclose(fp); 
}

2.Hàm fread đọc dữ liệu nhị phân

Nếu như ta có fscanf để đọc file văn bản thì fread là hàm để đọc dữ liệu trong file nhị phân.

Cú pháp:

fread(const void *ptr, size_t size, size_t n, FILE *fp);

Các đối số truyền vào fread tương tự như hàm fwirte ở trên vì thế bạn đọc có thể đọc lại ở phần trên!

Ở phần 1 trên, ta đã sử dụng fwirte để ghi dữ liệu vào file nhị phân. Bây giờ, tôi sẽ thực hiện đọc dữ liệu ở những file đó ra bằng hàm fread.

Đọc giá trị biến có trong file nhị phân

#include<stdio.h>
int main () {
   //con tro file
   FILE *fp;
   //khai bao bien chua du lieu 
   float val;
   //mo file voi che do doc nhi phan rb
   fp = fopen( "sopi.bin" , "rb" );
   //thuc hien doc du lieu va gan vao bien val
   fread(&val , 1 , sizeof(val) , fp );
   //hien thi ket qua doc
   printf("%f", val);
   //dong file
   fclose(fp);
}
Du lieu doc duoc la: 3.140000

Đọc giá trị mảng có trong file nhị phân

#include<stdio.h>
int main () {
   //con tro file
   FILE *fp;
   //khai bao mang chua du lieu
   int val[5];
   //mo file voi che do doc nhi phan rb
   fp = fopen( "soluong.bin" , "rb" );
   //thuc hien doc du lieu va gan vao mang val
   fread(val, sizeof(val), 1, fp);
   //hien thi du lieu vua doc
   printf("Du lieu doc duoc la: \n");
   printf("%d \n", val[0]);
   printf("%d \n", val[1]);
   printf("%d \n", val[2]);
   printf("%d \n", val[3]);
   printf("%d \n", val[4]);
   //dong file
   fclose(fp);
}
Du lieu doc duoc la:

101

203

303

404

505

Đọc struct có trong file nhị phân

#include <stdio.h>
struct ngaysinh
{
   int ngay;
   int thang;
   int nam;
};
int main()
{
   struct ngaysinh val;
   // con tro file
   FILE *fp;
   //mo file ngaysinh.bin voi che do doc nhi phan rb
   fp = fopen("ngaysinh.bin","rb");
   //doc du lieu va gan vao val
   fread(&val, sizeof(struct ngaysinh), 1, fp); 
   //hien thi du lieu
   printf("Du lieu doc duoc la: \n");
   printf("%d \n", val.ngay);
   printf("%d \n", val.thang);
   printf("%d \n", val.nam);
   //dong file
   fclose(fp); 
}
Du lieu doc duoc la:

15

9

2021

Nhận xét:

  • Mặc dù hai hàm này chủ yếu được thao tác với tệp nhị phân, tuy nhiên trong một số trường hợp ta vẫn sử dụng chúng cho đọc ghi dữ liệu từ tệp văn bản!
  • Hàm đọc dữ liệu nhị phân fread khi được thực thi sẽ không làm mất hay, xóa bỏ dữ liệu có trong tệp