Đọc ghi file binary trong C++

This entry is part 68 of 69 in the series Học C Không Khó

83 / 100

Có rất nhiều hàm phục vụ cho công việc đọc ghi file trong C. Trong bài hướng dẫn này, Lập trình không khó sẽ hướng dẫn bạn cách để làm việc với file sử dụng ngôn ngữ lập trình C. Một số hàm đọc ghi file trong C có thể kể tới như là: fprintf(), fscanf(), fread(), fwrite(), fseek … và một số hàm khác nữa.

Đọc ghi file binary trong C++

Nếu bạn đang tìm kiếm đọc ghi file trong C++, thì hãy đọc bài viết này nhé.

  • Tại sao chúng ta cần đến file?
  • Các kiểu file
    • 1. File văn bản – text files
    • 2. File nhị phân – Binary files
  • Các thao tác với file
  • Thao tác với file trên ngôn ngữ C
    • Thao tác mở file
    • Các tham số của “mode”
    • Thao tác đóng file
  • Đọc/Ghi file văn bản trong C
      • VD1. Ghi file sử dụng fprintf()
      • VD2. Đọc file sử dụng fscanf()
  • Đọc/Ghi file nhị phân trong C
      • Ghi file nhị phân
      • VD3. Ghi file nhị phân sử dụng fwrite()
      • Đọc file nhị phân
      • Ví dụ đọc file nhị phân sử dụng fread()
  • Một số ví dụ về đọc ghi file trong C
      • Ghi vào file một câu văn bản
      • Đọc dữ liệu văn bản từ file
  • Tham khảo

Tại sao chúng ta cần đến file?

  • Dữ liệu được lưu ở biến của chương trình, và nó sẽ biến mất khi chương trình kết thúc. Sử dụng file để lưu trữ dữ liệu cần thiết để đảm bảo dữ liệu của chúng ta không bị mất ngay cả khi chương trình của chúng ta ngừng chạy.
  • Nếu chương trình của bạn có đầu vào(input) là lớn, bạn sẽ rất vất vả nếu phải nhập mỗi khi chạy. Thay vào đó, hãy lưu vào file và chương trình của bạn sẽ tự đọc mỗi lần khởi chạy
  • Dễ dàng sao chép, di chuyển dữ liệu giữa các thiết bị với nhau

Các kiểu file

Trước khi bạn làm việc với file, bạn nên biết về 2 kiểu file khác nhau sau đây:

  1. File văn bản – text files
  2. File nhị phân – binary file

1. File văn bản – text files

File văn bản là file thường có đuôi là .txt. Những file này bạn có thể dễ dàng tạo ra bằng cách dùng các text editer thông dụng như Notepad, Notepad++, Sublime Text,…

Khi bạn mở các file này bằng các text editer nói trên, bạn sẽ thấy được văn bản ngay và có thể dễ dàng thao tác sửa, xóa, thêm nội dung của file này.

Kiểu file này thuận tiện cho chúng ta trong việc sử dụng hàng ngày, nhưng nó sẽ kém bảo mật và cần nhiều bộ nhớ để lưu trữ hơn.

2. File nhị phân – Binary files

File nhị phân thường có đuôi mở rộng là .bin

Thay vì lưu trữ dưới dạng văn bản thuần thúy, các file này được lưu dưới dạng nhị phân, chỉ bao gồm các số 0 và 1. Bạn cũng sẽ thấy các con số này nếu cố mở nó bằng 1 text editer kể trên.

Loại file này giúp lưu trữ được dữ liệu với kích thước lớn hơn, không thể đọc bằng các text editer thông thường và thông tin lưu trữ ở loại file được bảo mật hơn so với file văn bản.

Trong ngôn ngữ lập trình C, có một số thao tác chính khi làm việc với file, bao gồm cả file văn bản và file nhị phân:

  1. Tạo mới một file
  2. Mở một file đã có
  3. Đóng file đang mở
  4. Đọc thông tin từ file/ Ghi thông tin ra file

Thao tác với file trên ngôn ngữ C

Khi làm việc với file, bạn cần khai báo 1 con trỏ kiểu FILE. Việc khai báo này là cần thiết để có sự kết nối giữa chương trình của bạn và tập tin mà bạn cần thao tác.

Thao tác mở file

Để đọc ghi file trong C cũng như trong mọi ngôn ngữ lập trình, việc đầu tiên bạn cần làm là mở file mà bạn muốn làm việc. Trong ngôn ngữ lập trình C, chúng ta có thể mở file bằng cách sử dụng hàm fopen() trong thư viện stdio.h như sau:

fptr=fopen("fileopen","mode")

Trong đó mode là một tham số chúng ta cần chỉ định.

Ví dụ:

fptr=fopen("E:\\cprogram\\newprogram.txt","w");

// hoặc

fptr=fopen("E:\\cprogram\\oldprogram.bin","rb");

  • Giả sử tập tin newprogram.txt chưa có trong thư mục E:\cprogram. Ví dụ đầu tiên với mode = "w" sẽ cho phép chương trình tự động tạo ra file newprogram.txt nếu nó chưa có. Và sau đó mở file này lên nhưng chương trình chỉ có thể ghi dữ liệu vào mà không thể đọc.
  • Mode là w chỉ cho phép chương trình ghi(nếu đã có dữ liệu thì ghi đè) nội dung của file.
  • Với ví dụ thứ 2, mode là rb cho phép chương trình mở 1 file nhị phân đã có sẵn oldprogram.bin. Với trường hợp này, chương trình của bạn chỉ có thể đọc file và không thể ghi nội dung vào file.

Các tham số của “mode”

Dưới đây là các giá trị có thể có của tham số mode  nói trên:

ModeÝ nghĩaNếu file không tồn tại
r Mở file chỉ cho phép đọc Nếu file không tồn tại, fopen() trả về NULL.
rb Mở file chỉ cho phép đọc dưới dạng nhị phân. Nếu file không tồn tại, fopen() trả về NULL.
w Mở file chỉ cho phép ghi. Nếu file đã tồn tại, nội dung sẽ bị ghi đè. Nếu file không tồn tại, nó sẽ được tạo tự động.
wb Open for writing in binary mode. Nếu file đã tồn tại, nội dung sẽ bị ghi đè. Nếu file không tồn tại, nó sẽ được tạo tự động.
a Mở file ở chế độ ghi “append”. Tức là sẽ ghi vào cuối của nội dung đã có. Nếu file không tồn tại, nó sẽ được tạo tự động.
ab Mở file ở chế độ ghi nhị phân “append”. Tức là sẽ ghi vào cuối của nội dung đã có. Nếu file không tồn tại, nó sẽ được tạo tự động.
r+ Mở file cho phép cả đọc và ghi. Nếu file không tồn tại, fopen() trả về NULL.
rb+ Mở file cho phép cả đọc và ghi ở dạng nhị phân. Nếu file không tồn tại, fopen() trả về NULL.
w+ Mở file cho phép cả đọc và ghi. Nếu file đã tồn tại, nội dung sẽ bị ghi đè. Nếu file không tồn tại, nó sẽ được tạo tự động.
wb+ Mở file cho phép cả đọc và ghi ở dạng nhị phân. Nếu file đã tồn tại, nội dung sẽ bị ghi đè. Nếu file không tồn tại, nó sẽ được tạo tự động.
a+ Mở file cho phép đọc và ghi “append”. Nếu file không tồn tại, nó sẽ được tạo tự động.
ab+ Mở file cho phép đọc và ghi “append” ở dạng nhị phân. Nếu file không tồn tại, nó sẽ được tạo tự động.

Thao tác đóng file

Khi làm việc với tập tin hoàn tất, kể cả là file nhị phân hay file văn bản. Bạn cần đóng file sau khi làm việc với nó xong.

Việc đóng file đang mở có thể được thực hiện bằng cách dùng hàm fclose().

fclose(fptr);//Con trỏ FILE trỏ tới file cần được đóng.

Đọc/Ghi file văn bản trong C

Chúng ta sẽ học cách đọc ghi file trong C với file văn bản trước. Với file nhị phân, bạn kéo xuống dưới để xem tiếp.

Để làm việc với file văn bản, chúng ta sẽ sử dụng fprintf()fscanf().

VD1. Ghi file sử dụng fprintf()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#include

#include

intmain()

{

   intnum;

   FILE *fptr;

   fptr= fopen("C:\\program.txt","w");

   if(fptr==NULL)

   {

      printf("Error!");  

      exit(1);            

   }

   printf("Enter num: ");

   scanf("%d",&num);

   fprintf(fptr,"%d",num);

   fclose(fptr);

   return0;

}

Chương trình nhận số num từ bàn phím và ghi vào file văn bản program.txt.

Sau khi bạn chạy chương trình này, bạn sẽ thấy file văn bản program.txt được tạo mới trong ổ C trên máy tính bạn. Khi mở file này lên, bạn sẽ thấy số mà bạn vừa nhập cho biến num kia.

VD2. Đọc file sử dụng fscanf()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include

#include

intmain()

{

   intnum;

   FILE *fptr;

   if((fptr =fopen("C:\\program.txt","r"))==NULL){

       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   fscanf(fptr,"%d",&num);

   printf("Value of n=%d",num);

   fclose(fptr);

   return0;

}

Chương trình này sẽ đọc giá trị số được lưu trong file program.txt mà chương trình ở VD1 vừa tạo ra và in lên màn hình.

Đọc/Ghi file nhị phân trong C

Các hàm fread()fwrite() trong C được sử dụng để đọc và ghi file trong C ở dạng nhị phân.

Ghi file nhị phân

Để ghi file nhị phân, bạn cần sử dụng hàm fwrite(). Hàm này cần 4 tham số: địa chỉ của biến lưu dữ liệu cần ghi, kích thước của biến lưu dữ liệu đó, số lượng kiểu dữ liệu của biến đó và con trỏ FILE trỏ tới file bạn muốn ghi.

fwrite(address_data,size_data,numbers_data,pointer_to_file);

VD3. Ghi file nhị phân sử dụng fwrite()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

#include

#include

structthreeNum

{

   intn1,n2,n3;

};

intmain()

{

   intn;

   structthreeNum num;

   FILE *fptr;

   if((fptr= fopen("C:\\program.bin","wb"))==NULL){

       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   for(n=1;n<5;++n)

   {

      num.n1 =n;

      num.n2=5*n;

      num.n3=5*n+ 1;

      fwrite(&num,sizeof(structthreeNum),1,fptr);

   }

   fclose(fptr);

   return0;

}

Trong VD3 này, chương trình sẽ tạo ra một file program.bin trên ổ đĩa C của bạn. Chương trình này đã khai báo 1 kiểu dữ liệu cấu trúc lưu 3 giá trị số n1, n2, n3; Và nó được sử dụng trong hàm main có tên biến là num.

Trong vòng lặp, các số được ghi vào file sử dụng hàm fwrite(). Các tham số gồm:

  • Tham số đầu tiên là địa chỉ của biến num
  • Tham số thứ 2 là kích thước của biến num
  • Tham số thứ 3 là số lượng kiểu dữ liệu – ở đây là 1.
  • Tham số thứ 4 là con trỏ FILE trỏ tới tệp tin program.bin

Cuối cùng, chúng ta đóng file sử dụng fclose().

Đọc file nhị phân

Hàm fread() cũng có 4 tham số tương tự như hàm fwrite() phía trên.

fread(address_data,size_data,numbers_data,pointer_to_file);

Ví dụ đọc file nhị phân sử dụng fread()

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

#include

#include

structthreeNum

{

   intn1,n2,n3;

};

intmain()

{

   intn;

   structthreeNum num;

   FILE *fptr;

   if((fptr= fopen("C:\\program.bin","rb"))==NULL){

       printf("Error! opening file");

       // Program exits if the file pointer returns NULL.

       exit(1);

   }

   for(n=1;n<5;++n)

   {

      fread(&num, sizeof(structthreeNum),1,fptr);

      printf("n1: %d\tn2: %d\tn3: %d",num.n1, num.n2,num.n3);

   }

   fclose(fptr);

   return0;

}

Trong ví dụ này, bạn đọc file program.bin và lặp qua từng dòng. Bạn sẽ nhận được các giá trị tương ứng khi bạn ghi vào trong VD3.

Một số ví dụ về đọc ghi file trong C

Trong phần này, mình sẽ trình bày 2 ví dụ về đọc ghi file trong C, bao gồm các bài tập đọc ghi file sau:

  • Ghi văn bản vào file trong C
  • Đọc dữ liệu văn bản từ file trong C

Ghi vào file một câu văn bản

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include

#include   /* For exit() function */

intmain()

{

   charsentence[1000];

   FILE *fptr;

   fptr=fopen("program.txt","w");

   if(fptr==NULL)

   {

      printf("Error!");

      exit(1);

   }

   printf("Enter a sentence:\n");

   gets(sentence);

   fprintf(fptr,"%s",sentence);

   fclose(fptr);

   return0;

}

Chạy thử:

Enter sentence:

I am awesome and so are files.

Đọc dữ liệu văn bản từ file

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include

#include // For exit() function

intmain()

{

    charc[1000];

    FILE *fptr;

    if ((fptr=fopen("program.txt","r"))==NULL)

    {

        printf("Error! opening file");

        // Program exits if file pointer returns NULL.

        exit(1);        

    }

    // reads text until newline

    fscanf(fptr,"%[^\n]",c);

    printf("Data from the file:\n%s",c);

    fclose(fptr);

    return0;

}

Giả sử file văn bản program.txt có nội dung như sau:

C programming is awesome.

I love C programming.

How are you doing?

Chạy thử:

Data from the file:Cprogramming isawesome.

Tham khảo

  1. https://www.programiz.com/c-programming/c-file-input-output