Xem thêm

Đọc và Ghi File trong C: Thủ thuật và Lưu ý quan trọng

Huy Erick
Chào mừng đến với bài viết tiếp theo trong series học lập trình C của chúng ta. Trong bài trước, chúng ta đã tìm hiểu về các thiết bị nhập - xuất trong ngôn ngữ...

Chào mừng đến với bài viết tiếp theo trong series học lập trình C của chúng ta. Trong bài trước, chúng ta đã tìm hiểu về các thiết bị nhập - xuất trong ngôn ngữ C. Trong bài viết này, chúng ta sẽ khám phá cách lập trình viên tạo, mở và đóng các file văn bản hoặc file nhị phân để lưu trữ dữ liệu.

Mở file trong C

Đầu tiên, chúng ta cần sử dụng hàm fopen() để tạo file mới hoặc mở file đã tồn tại. Hàm này trả về một đối tượng loại FILE, chứa thông tin cần thiết để điều khiển luồng. Dưới đây là cách gọi hàm:

FILE *fopen(const char *ten_file, const char *che_do);

Ở đây, ten_file là một chuỗi, coi như tên của file và che_do là giá trị truy cập, có thể là những giá trị sau:

  • "r": Mở file để đọc.
  • "w": Mở file để ghi. Nếu file đã tồn tại, nó sẽ bị xóa và tạo mới. Ghi nội dung sẽ bắt đầu từ đầu file.
  • "a": Mở file để ghi tiếp vào cuối file. Nếu file chưa tồn tại, nó sẽ được tạo mới. Ghi nội dung sẽ chỉ diễn ra ở cuối file.
  • "r+": Mở file để đọc và ghi.
  • "w+": Mở file để đọc và ghi. Nếu file đã tồn tại, nó sẽ bị xóa và tạo mới.
  • "a+": Mở file để đọc và ghi. Nếu file không tồn tại, nó sẽ được tạo mới. Đọc file sẽ bắt đầu từ đầu, nhưng ghi file sẽ chỉ diễn ra ở cuối file.

Nếu bạn đang làm việc với các file nhị phân, bạn có thể sử dụng các cách truy cập khác nhau, ví dụ như "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b".

Đóng file trong C

Khi bạn đã hoàn thành công việc với file, bạn có thể đóng nó bằng cách sử dụng hàm fclose(). Dưới đây là cách gọi hàm:

int fclose(FILE *fp);

Hàm fclose() trả về giá trị zero nếu thành công hoặc EOF (End of File) nếu có lỗi trong quá trình đóng file. Hàm này thực tế xóa dữ liệu trong bộ đệm của file, đóng file và giải phóng bộ nhớ đã sử dụng cho file. EOF là một hằng số được định nghĩa trong thư viện stdio.h.

Ghi vào file trong C

Để ghi vào file, chúng ta có thể sử dụng hàm fputc() để ghi từng ký tự đơn lẻ vào một luồng:

int fputc(int c, FILE *fp);

Hàm fputc() sẽ ghi ký tự có giá trị c vào một luồng đầu ra được tham chiếu bởi con trỏ fp. Nó trả về ký tự đã ghi nếu thành công hoặc EOF nếu có lỗi. Bạn cũng có thể sử dụng hàm fputs() để ghi một chuỗi kết thúc bằng ký tự null vào một luồng:

int fputs(const char *s, FILE *fp);

Hàm fputs() sẽ ghi chuỗi s vào một luồng đầu ra được tham chiếu bởi fp. Nó trả về một giá trị không âm nếu thành công và trả về ký tự EOF nếu xảy ra lỗi. Bạn cũng có thể sử dụng hàm fprintf() để ghi một chuỗi vào file. Hãy xem ví dụ dưới đây:

#include   int main() {    FILE *fp;    fp = fopen("vidu.txt", "w+");    fprintf(fp, "Ví dụ kiểm tra hàm fprintf ...\n");    fputs("Ví dụ kiểm tra hàm fputs ...\n", fp);    fclose(fp); }

Khi bạn biên dịch và chạy đoạn code trên, nó sẽ tạo một file mới có tên là vidu.txt và ghi vào đó 2 dòng với 2 hàm khác nhau. Chúng ta sẽ tiếp tục đọc file này ở phần tiếp theo.

Đọc file trong C

Để đọc từng ký tự riêng lẻ từ file, chúng ta có thể sử dụng hàm fgetc():

int fgetc(FILE *fp);

Hàm fgetc() sẽ đọc một ký tự từ file được tham chiếu bởi con trỏ fp. Giá trị trả về là ký tự đã đọc nếu thành công và EOF nếu xảy ra lỗi. Bạn cũng có thể sử dụng hàm fgets() để đọc một chuỗi từ một luồng:

char *fgets(char *buf, int n, FILE *fp);

Hàm fgets() sẽ đọc n-1 ký tự từ một luồng được tham chiếu bởi fp. Nó sao chép chuỗi đã đọc vào bộ đệm buf và thêm ký tự null vào cuối chuỗi.

Nếu hàm gặp ký tự xuống dòng '\n' hoặc ký tự EOF trước khi đọc được số lượng ký tự tối đa, hàm sẽ chỉ trả về các ký tự cho đến ký tự xuống dòng và ký tự xuống dòng mới. Bạn cũng có thể sử dụng hàm fscanf() để đọc chuỗi từ file, nhưng dừng đọc ở khoảng trắng đầu tiên gặp phải:

#include   int main() {    FILE *fp;    char buff[255];    fp = fopen("vidu.txt", "r");    fscanf(fp, "%s", buff);    printf("1: %s\n", buff);    fgets(buff, 255, (FILE*)fp);    printf("2: %s\n", buff);    fgets(buff, 255, (FILE*)fp);    printf("3: %s\n", buff);    fclose(fp); }

Khi bạn biên dịch và chạy chương trình C trên, nó sẽ đọc từ file được tạo từ phần trước và in ra kết quả như sau:

Kết quả đọc file trong C

Hãy xem một chút chi tiết hơn về những gì đã xảy ra ở đây. Đầu tiên, fscanf() chỉ đọc từ file từ ký tự T trong từ This vì sau đó nó gặp ký tự cách, tiếp theo hàm fgets() trả về các dòng còn lại cho đến khi gặp ký tự cuối file. Cuối cùng, nó gọi hàm fgets() để đọc toàn bộ dòng thứ 2.

Ghi và Đọc File nhị phân trong C

Cuối cùng, chúng ta cũng có thể sử dụng hai hàm fread()fwrite() để ghi và đọc các khối bộ nhớ, thường là các mảng hoặc cấu trúc.

Dưới đây là cú pháp của hai hàm đó:

size_t fread(void *ptr, size_t kich_co_cua_cac_phan_tu, size_t so_phan_tu, FILE *ten_file); size_t fwrite(const void *ptr, size_t kich_co_cua_cac_phan_tu, size_t so_phan_tu, FILE *ten_file);

Với hai hàm này, bạn có thể thực hiện việc ghi và đọc dữ liệu nhị phân với sự linh hoạt cao.

Tổng kết

Trong bài viết này, chúng ta đã tìm hiểu cách ghi và đọc file trong ngôn ngữ lập trình C. Điều này sẽ mở ra nhiều cơ hội cho chúng ta để lưu trữ và truy xuất dữ liệu hiệu quả từ các file. Hãy thực hành thêm và khám phá thêm về các hàm và tính năng liên quan trong ngôn ngữ C để trở thành một lập trình viên chuyên nghiệp.

Tham khảo:

  • Học lập trình C cơ bản
  • Thư viện chuẩn C

Hy vọng rằng bài viết này đã cung cấp cho bạn những kiến thức cơ bản và hữu ích về việc đọc và ghi file trong ngôn ngữ C. Hãy tiếp tục học tập và khám phá thêm về các chủ đề khác trong lĩnh vực lập trình.

Bài viết trước: Đọc và Ghi Dữ liệu trong C Bài viết tiếp: Tiền xử lý trong C

1