Xử lý File là việc lưu trữ dữ liệu trong một file bằng chương trình. Trong ngôn ngữ lập trình C, các chương trình lưu trữ kết quả và các dữ liệu khác của chương trình vào một file bằng cách sử dụng xử lý file trong C. Ngoài ra, chúng ta có thể trích xuất/lấy dữ liệu từ một file để làm việc với nó trong chương trình.
Các thao tác bạn có thể thực hiện trên một File trong C là:
Tạo file mới
Mở file đã tồn tại
Đọc dữ liệu từ file hiện có
Ghi dữ liệu vào file
Di chuyển dữ liệu đến vị trí cụ thể trên file
Đóng file
Tạo hoặc mở file bằng fopen()
Hàm fopen() được dùng để tạo file mới hoặc mở file hiện có trong C. Hàm fopen được định nghĩa trong file header stdio.h.
Bây giờ, hãy xem cú pháp để tạo file mới hoặc mở file
file = fopen(“file_name”, “mode”)
Đây là cú pháp chung cho cả việc mở và tạo file trong C.
Tham số
file_name - Là một chuỗi chỉ định tên của file sẽ được mở hoặc tạo bằng phương thức fopen. mode: Là một chuỗi (thường là một ký tự) chỉ định chế độ mà file sẽ được mở. Có nhiều chế độ khác nhau để mở file trong C, chúng ta sẽ tìm hiểu về tất cả chúng sau trong bài viết này.
Khi nào file sẽ được tạo?
Hàm fopen sẽ tạo file mới khi nó không tìm thấy bất kỳ file nào có tên được chỉ định ở vị trí được chỉ định. Ngược lại, nếu tìm thấy file, nó sẽ được mở với chế độ được chỉ định.
Hãy xem một ví dụ để làm rõ khái niệm, Giả sử chúng ta đang mở một file tên hello.txt bằng hàm fopen. Câu lệnh sau sẽ được thực hiện,
file = fopen(“hello.txt”, “w”)
Điều này sẽ tìm kiếm file tên hello.txt trong thư mục hiện tại. Nếu file tồn tại, nó sẽ mở file, ngược lại nó sẽ tạo file mới tên “hello.txt” và mở nó ở chế độ ghi (được chỉ định bằng “w”).
Bây giờ, hãy xem tất cả các loại chế độ có sẵn để đọc hoặc ghi file trong C, và xem các đoạn code mẫu cho thấy các chạy thử của code.
Chế độ = “r” - mở để đọc, chế độ này sẽ mở file chỉ để đọc, tức là nội dung chỉ có thể xem, không thể làm gì khác như chỉnh sửa.
Chế độ này không thể tạo file mới và open() trả về NULL, nếu chúng ta cố tạo file mới bằng chế độ này.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "r")){ printf("Mở file thành công ở chế độ đọc"); } else printf("File không tồn tại! không thể tạo file mới dùng chế độ r"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc
Chúng ta đã tạo file hello.txt trong thư mục hiện tại nhưng nếu cố truy cập file khác thì sẽ nhận được “File không tồn tại! không thể tạo file mới dùng chế độ r”.
Chế độ = “rb” - mở để đọc ở chế độ nhị phân, chế độ này sẽ mở file chỉ để đọc ở chế độ nhị phân, tức là nội dung chỉ có thể xem và không thể chỉnh sửa.
Chế độ này không thể tạo file mới và open() trả về NULL, nếu cố tạo file mới bằng chế độ này.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("program.txt", "rb")){ printf("Mở file thành công ở chế độ đọc"); } else printf("File không tồn tại! không thể tạo file mới dùng chế độ rb"); fclose(file); return 0; }Đầu ra
File không tồn tại! không thể tạo file mới dùng chế độ rb
Chế độ = “w” - mở chỉ để ghi, chế độ này sẽ mở file nếu có trong thư mục hiện tại chỉ để ghi, tức là không thể thực hiện thao tác đọc. Nếu file không có trong thư mục hiện tại, chương trình sẽ tạo file mới và mở nó để ghi.
Nếu mở file đã chứa một số văn bản, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("helo.txt", "w")){ printf("Mở file thành công ở chế độ ghi hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ ghi hoặc tạo file mới
Bạn thấy ở đây, chúng ta cố mở file “helo.txt” không có trong thư mục, vẫn trả về thông báo thành công vì nó đã tạo file “helo.txt”.
Chế độ = “wb” - mở để ghi ở chế độ nhị phân, chế độ này sẽ mở file nếu có trong thư mục hiện tại để ghi ở chế độ nhị phân, tức là không thể đọc. Nếu file không có, chương trình sẽ tạo file mới và mở nó để ghi ở chế độ nhị phân.
Nếu mở file đã chứa văn bản, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "wb")){ printf("Mở file thành công ở chế độ ghi nhị phân hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ ghi nhị phân hoặc tạo file mới
Chế độ = “a” - mở chỉ để thêm, chế độ này sẽ mở file nếu có trong thư mục hiện tại chỉ để ghi, tức là không thể đọc. Nếu file không có, chương trình sẽ tạo file mới và mở nó để ghi. Nếu mở file đã chứa văn bản, nội dung sẽ không bị ghi đè; thay vào đó văn bản mới sẽ được thêm sau văn bản hiện có.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "a")){ printf("Mở file thành công ở chế độ thêm hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ thêm hoặc tạo file mới
Chế độ = “ab” - mở để thêm ở chế độ nhị phân, chế độ này sẽ mở file nếu có trong thư mục hiện tại để ghi ở chế độ nhị phân, tức là không thể đọc. Nếu file không có, chương trình sẽ tạo file mới và mở nó để ghi ở chế độ nhị phân.
Nếu mở file đã chứa văn bản, nội dung sẽ không bị ghi đè; thay vào đó văn bản mới sẽ được thêm sau văn bản hiện có.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "ab")){ printf("Mở file thành công ở chế độ thêm nhị phân hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ thêm nhị phân hoặc tạo file mới
Chế độ = “r+” - mở để đọc và ghi cả hai, chế độ này sẽ mở file cho cả hai mục đích đọc và ghi, tức là cả thao tác đọc và ghi đều có thể thực hiện trên file.
Chế độ này không thể tạo file mới và open() trả về NULL, nếu cố tạo file mới bằng chế độ này.
Nếu mở file đã chứa văn bản và ghi gì đó, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "r+")){ printf("Mở file thành công ở chế độ đọc và ghi cả hai"); } else printf("File không tồn tại! không thể tạo file mới dùng chế độ r+"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc và ghi cả hai
Chúng ta đã tạo file hello.txt trong thư mục hiện tại nhưng nếu cố truy cập file khác thì sẽ nhận được “File không tồn tại! không thể tạo file mới dùng chế độ r+”.
Chế độ = “rb+” - mở để đọc ở chế độ nhị phân, chế độ này sẽ mở file để đọc ở chế độ nhị phân, tức là nội dung chỉ có thể xem và không thể chỉnh sửa.
Chế độ này không thể tạo file mới và open() trả về NULL, nếu cố tạo file mới bằng chế độ này.
Nếu mở file đã chứa văn bản và ghi gì đó, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("program.txt", "rb+")){ printf("Mở file thành công ở chế độ đọc"); } else printf("File không tồn tại! không thể tạo file mới dùng chế độ rb+"); fclose(file); return 0; }Đầu ra
File không tồn tại! không thể tạo file mới dùng chế độ rb+
Chế độ = “w” - mở để ghi và đọc, chế độ này sẽ mở file nếu có trong thư mục hiện tại cho cả ghi và đọc. Nếu file không có trong thư mục hiện tại, chương trình sẽ tạo file mới và mở nó để đọc và ghi.
Nếu mở file đã chứa văn bản, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("helo.txt", "w+")){ printf("Mở file thành công ở chế độ đọc-ghi hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc-ghi hoặc tạo file mới
Bạn thấy ở đây, chúng ta cố mở file “helo.txt” không có trong thư mục, vẫn trả về thành công vì nó đã tạo file “helo.txt”.
Chế độ = “wb+”: mở để ghi và đọc ở chế độ nhị phân, chế độ này sẽ mở file nếu có trong thư mục hiện tại để ghi và đọc ở chế độ nhị phân. Nếu file không có trong thư mục hiện tại, chương trình sẽ tạo file mới và mở nó để đọc và ghi ở chế độ nhị phân. Nếu mở file đã chứa văn bản, nội dung sẽ bị ghi đè.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "wb+")){ printf("Mở file thành công ở chế độ đọc-ghi nhị phân hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc-ghi nhị phân hoặc tạo file mới
Chế độ = “a+” - mở để đọc và thêm, chế độ này sẽ mở file nếu có trong thư mục hiện tại cho cả đọc và ghi. Nếu file không có trong thư mục hiện tại, chương trình sẽ tạo file mới và mở nó cho đọc và ghi.
Nếu mở file đã chứa văn bản, nội dung sẽ không bị ghi đè; thay vào đó văn bản mới sẽ được thêm sau văn bản hiện có.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "a+")){ printf("Mở file thành công ở chế độ đọc-thêm hoặc tạo file mới"); } else printf("Lỗi!"); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc-thêm hoặc tạo file mới
Chế độ = “ab+” - mở để đọc và thêm ở chế độ nhị phân, chế độ này sẽ mở file nếu có trong thư mục hiện tại cho cả đọc và ghi ở chế độ nhị phân. Nếu file không có trong thư mục hiện tại, chương trình sẽ tạo file mới và mở nó cho đọc và ghi ở chế độ nhị phân. Nếu mở file đã chứa văn bản, nội dung sẽ không bị ghi đè; thay vào đó văn bản mới sẽ được thêm sau văn bản hiện có.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "ab+")){ printf("Mở file thành công ở chế độ đọc-thêm nhị phân hoặc tạo file mới"); } else printf("Lỗi!”); fclose(file); return 0; }Đầu ra
Mở file thành công ở chế độ đọc-thêm hoặc tạo file mới
Đọc dữ liệu từ file hiện có
Chúng ta có thể đọc nội dung file trong C bằng các hàm fscanf(), fgets() và fgetc(). Tất cả đều dùng để đọc nội dung file. Hãy xem cách hoạt động của từng hàm:
fscanf()
Hàm fscanf() được dùng để đọc tập ký tự tức là chuỗi từ file. Nó trả về EOF khi đã đọc hết nội dung file.
Cú pháp
int fscanf(FILE *stream, const char *charPointer[])
Tham số
FILE *stream: con trỏ đến file đã mở. const char *charPointer[]: chuỗi ký tự.
Ví dụ
#include <stdio.h> int main(){ FILE * file; char str[500]; if (file = fopen("hello.txt", "r")){ while(fscanf(file,"%s", str)!=EOF){ printf("%s", str); } } else printf("Lỗi!”); fclose(file); return 0; }Đầu ra
LearnprogrammingattutorialsPoint
fgets()
Hàm fget() trong C được dùng để đọc chuỗi từ luồng.
Cú pháp
char* fgets(char *string, int length, FILE *stream)
Tham số
char *string: Chuỗi sẽ lưu dữ liệu từ chuỗi. int length: Độ dài chuỗi cần xem xét. FILE *stream: Con trỏ đến file đã mở.
Ví dụ
#include <stdio.h> int main(){ FILE * file; char str[500]; if (file = fopen("hello.txt", "r")){ printf("%s", fgets(str, 50, file)); } fclose(file); return 0; }Đầu ra
Learn programming at tutorials Point
fgetc()
Hàm fgetc() trong C được dùng để trả về một ký tự đơn từ file. Nó lấy một ký tự từ file và trả về EOF ở cuối file.
Cú pháp
char* fgetc(FILE *stream)
Tham số
FILE *stream: Con trỏ đến file đã mở.
Ví dụ
#include <stdio.h> int main(){ FILE * file; char str; if (file = fopen("hello.txt", "r")){ while((str=fgetc(file))!=EOF) printf("%c",str); } fclose(file); return 0; }Đầu ra
Learn programming at tutorials Point
Ghi dữ liệu vào file trong C
Chúng ta có thể ghi dữ liệu vào file trong C bằng các hàm fprintf(), fputs(), fputc(). Tất cả đều dùng để ghi nội dung vào file.
Hãy xem cách hoạt động của từng hàm:
fprintf()
Hàm fprintf() được dùng để ghi dữ liệu vào file. Nó ghi một tập ký tự vào file.
Cú pháp
int fprintf(FILE *stream, char *string[])
Tham số
FILE for *stream: Con trỏ đến file đã mở. char *string[]: Mảng ký tự muốn ghi vào file.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "w")){ if(fprintf(file, "tutorials Point”) >= 0) printf("Thao tác ghi thành công"); } fclose(file); return 0; }Đầu ra
Thao tác ghi thành công
fputs()
Hàm fputs() trong C có thể dùng để ghi vào file. Nó dùng để ghi một dòng (dòng ký tự) vào file.
Cú pháp
int fputs(const char *string, FILE *stream)
Tham số
Constant char *string[]: Mảng ký tự muốn ghi vào file. FILE for *stream: Con trỏ đến file đã mở.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "w")){ if(fputs("tutorials Point", file) >= 0) printf("Chuỗi đã được ghi vào file thành công..."); } fclose(file); return 0; }Đầu ra
Chuỗi đã được ghi vào file thành công…
fputc()
Hàm fputc() được dùng để ghi một ký tự đơn vào file.
Cú pháp
int fputc(char character , FILE *stream)
Tham số
char character: Ký tự muốn ghi vào file. FILE for *stream: Con trỏ đến file đã mở.
Ví dụ
#include <stdio.h> int main(){ FILE * file; if (file = fopen("hello.txt", "w")){ fputc('T', file); } fclose(file); return 0; }Đầu ra
‘T’ được ghi vào file.
fclose()
Hàm fclose() được dùng để đóng file đã mở. Chúng ta nên đóng file sau khi thực hiện các thao tác trên nó để lưu các thao tác đã áp dụng.
Cú pháp
fclose(FILE *stream)
Tham số
FILE for *stream: Con trỏ đến file đã mở.
Ví dụ
#include <stdio.h> int main(){ FILE * file; char string[300]; if (file = fopen("hello.txt", "a+")){ while(fscanf(file,"%s", string)!=EOF){ printf("%s", string); } fputs("Hello", file); } fclose(file); return 0; }Đầu ra
LearnprogrammingatTutorialsPoint
Nội dung file
Learn programming at Tutorials PointHello