Trong ngôn ngữ lập trình C, có nhiều hàm hữu ích để thực hiện việc đọc và ghi tệp tin. Chúng ta sẽ đi qua một số hàm quan trọng để làm việc với tệp tin trong C, như fprintf()
, fscanf()
, fread()
, fwrite()
, và fseek()
. Những hàm này cho phép chúng ta linh hoạt thao tác với tệp tin, cho phép đọc, ghi, tìm kiếm và di chuyển trong tệp tin dễ dàng.
Nếu bạn đang tìm kiếm đọc ghi file trong C++, hãy đọc bài viết này nhé.
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 mất công phải nhập từng khối 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 khi 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
File văn bản là file thông 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ác công cụ đồng nhất như Notepad, Notepad++, Sublime Text,...
Khi bạn mở các file này bằng các công cụ trên, bạn sẽ thấy 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ướng dạng văn bản thông thường, file này lưu trữ dướng 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 thông thường và thông tin lưu trữ ở dạng file được bảo mật hơn so với file văn bản.
Ví dụ về thao tác với file trên ngôn ngữ 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 việc sử dụng hàm fopen()
trong thư viện stdio.h
như sau:
fptr = fopen("têp_ten","mode")
Trong đó mode
là một tham số cần chỉ định.
Ví dụ:
fptr = fopen("E:cteptennew.csv","w");
hoặc
fptr = fopen("E:cteptenold.bin","rb");
-
Giả sử tập tin
new.csv
chưa có trong thư mụcE:ctepten
. Với mode = "w" sẽ cho phép chương trình tự động tạo ra tập tinnew.csv
nếu nó chưa có. Và sau đó mở tệp này lên để 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 trong thư mụcE:ctepten
. 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 được trình bày trên:
Mode | Ý nghĩa |
---|---|
r | Mở file cho phép đọc |
rb | Mở file cho phép đọc ở dạng nhị phân |
w | Mở file 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 | Mở file cho phép 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 ở chế độ ghi “append”. Tức là sẽ ghi vào cuối của nội dung có sẵn |
ab | Mở file ở chế độ ghi nhị phân “append”. Tức là sẽ ghi vào cuối của nội dung có sẵn |
r+ | Mở file cho phép cả đọc và ghi |
rb+ | Mở file cho phép cả đọc và ghi ở dạng nhị phân |
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 ở chế độ cả đọc và ghi “append” |
ab+ | Mở file ở chế độ cả đọc và ghi ở dạng nhị phân “append” |
Thao tác đóng file
Khi làm việc với tập tin, bạn cần đóng file sau khi hoàn tất, bất kể là file nhị phân hay file văn bản. Việc đóng file đang mở có thể thực hiện bằng cách sử dụng hàm fclose()
.
fclose(fptr); //Con trỏ FILE trỏ tới file cần đóng.
Đọc/Ghi file văn bản trong C
Để làm việc với file văn bản, chúng ta sẽ sử dụng fprintf()
và fscanf()
.
Ví dụ ghi file văn bản sử dụng fprintf()
#include
#include
int main() {
int num;
FILE *fptr;
fptr = fopen("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 của bạn. Khi mở file này lên, bạn sẽ thấy số mà bạn vừa nhập vào từ bàn phím.
Ví dụ đọc file văn bản sử dụng fscanf()
#include
#include
int main() {
int num;
FILE *fptr;
if ((fptr = fopen("program.txt", "r")) == NULL) {
printf("Error! Opening file");
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 ở ví dụ trước vừa tạo ra và in lên màn hình.
Đọc/Ghi file nhị phân trong C
Hàm fread()
và fwrite()
trong C được sử dụng để đọc và ghi file nhị phân.
Ví dụ ghi file nhị phân sử dụng fwrite()
#include
#include
struct threeNum {
int n1, n2, n3;
};
int main() {
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("program.bin", "wb")) == NULL) {
printf("Error! Opening file");
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 ví dụ này, chương trình sẽ tạo ra một file nhị phân trên ổ đĩa C của bạn. Chương trình này định nghĩa một kiểu dữ liệu cấu trúc lưu 3 giá trị số n1
, n2
và n3
và sử dụng trong hàm main
có tên biến là num
.
Trong vòng lặp, số được ghi vào file sử dụng hàm fwrite()
. Các tham số bao gồm:
- Tham số đầu tiên là địa chỉ của biến
num
. - Tham số thứ hai là kích thước của biến
num
. - Tham số thứ ba là số lượng kiểu dữ liệu - ở đây là 1.
- Tham số thứ tư là con trỏ FILE trỏ tới file bạn muốn ghi.
Cuối cùng, chúng ta sẽ đóng file sử dụng fclose()
.
Ví dụ đọc file nhị phân sử dụng fread()
#include
#include
struct threeNum {
int n1, n2, n3;
};
int main() {
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("program.bin","rb")) == NULL) {
printf("Error! Opening file");
exit(1);
}
for(n = 1; n 5; ++n) {
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
Trong ví dụ này, bạn sẽ đọ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ào file một câu văn bản
#include
#include
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\n", sentence);
fclose(fptr);
return 0;
}
- Đọc dữ liệu văn bản từ file
#include
#include
int main() {
char c[1000];
FILE *fptr;
if ((fptr = fopen("program.txt", "r")) == NULL) {
printf("Error! Opening file");
exit(1);
}
// đọc văn bản cho đến khi gặp dấu xuống dòng
fscanf(fptr, "%[^\n]", c);
printf("Data from the file:\n%s\n", c);
fclose(fptr);
return 0;
}