Đọc và ghi file trong C
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:
- File văn bản – text files
- 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.
Các thao tác với file
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:
- Tạo mới một file
- Mở một file đã có
- Đóng file đang mở
- Đọ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.
0 1 2 | FILE *fptr; |
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:
0 1 2 | fptr = fopen("fileopen","mode") |
Trong đó mode
là một tham số chúng ta cần chỉ định.
Ví dụ:
0 1 2 3 4 5 6 | 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ụcE:\cprogram
. Ví dụ đầu tiên vớimode = "w"
sẽ cho phép chương trình tự động tạo ra filenewprogram.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ẵnoldprogram.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ĩa | Nế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()
.
0 1 2 | 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()
và fscanf()
.
VD1. Ghi file sử dụng fprintf()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #include <stdio.h> #include <stdlib.h> int main() { int num; 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); return 0; } |
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()
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> int main() { int num; 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); return 0; } |
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()
và 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.
0 1 2 | fwrite(address_data,size_data,numbers_data,pointer_to_file); |
VD3. Ghi file nhị phân sử dụng fwrite()
0 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 33 | #include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }; int main() { int n; struct threeNum 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(struct threeNum), 1, fptr); } fclose(fptr); return 0; } |
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.
0 1 2 | fread(address_data,size_data,numbers_data,pointer_to_file); |
Ví dụ đọc file nhị phân sử dụng fread()
0 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 | #include <stdio.h> #include <stdlib.h> struct threeNum { int n1, n2, n3; }; int main() { int n; struct threeNum 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(struct threeNum), 1, fptr); printf("n1: %d\tn2: %d\tn3: %d", num.n1, num.n2, num.n3); } fclose(fptr); return 0; } |
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
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> /* For exit() function */ int main() { char sentence[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); return 0; } |
Chạy thử:
0 1 2 3 | Enter sentence: I am awesome and so are files. |
Đọc dữ liệu văn bản từ file
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <stdlib.h> // For exit() function int main() { char c[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); return 0; } |
Giả sử file văn bản program.txt
có nội dung như sau:
0 1 2 3 4 | C programming is awesome. I love C programming. How are you doing? |
Chạy thử:
0 1 2 | Data from the file: C programming is awesome. |
Không có nhận xét nào: