Hướng dẫn cơ bản về Xử lý Tệp trong C

Xin chào các bạn tương lai của lập trình! Hôm nay, chúng ta sẽ bắt đầu một chuyến hành trình thú vị vào thế giới Xử lý Tệp trong C. Đừng lo lắng nếu bạn chưa bao giờ viết một dòng mã trước đây - tôi sẽ là người hướng dẫn bạn, và chúng ta sẽ cùng nhau từng bước. Cuối cùng của bài hướng dẫn này, bạn sẽ có thể manipulates files như một chuyên gia!

C - File I/O (File Handling)

Xử lý Tệp là gì và chúng ta cần nó vì sao?

Hãy tưởng tượng bạn đang viết một日记. Mỗi ngày, bạn mở日记, viết về ngày của bạn, và sau đó đóng nó lại. Ngày mai, bạn có thể mở nó ra và đọc những gì bạn đã viết hôm qua. Xử lý tệp trong C hoạt động tương tự!

Xử lý tệp cho phép các chương trình của chúng ta tương tác với các tệp trên máy tính của chúng ta. Chúng ta có thể tạo mới tệp, ghi dữ liệu vào chúng, đọc dữ liệu từ chúng, và thậm chí sửa đổi các tệp hiện có. Điều này rất quan trọng vì nó cho phép các chương trình của chúng ta lưu trữ và truy xuất thông tin ngay cả sau khi chương trình đã kết thúc chạy.

Ví dụ thực tế

Hãy nói bạn đang tạo một chương trình sổ địa chỉ đơn giản. Nếu không có xử lý tệp, tất cả các liên hệ bạn thêm vào sẽ biến mất ngay khi bạn đóng chương trình. Với xử lý tệp, bạn có thể lưu các liên hệ đó vào một tệp và tải chúng lại khi bạn khởi động lại chương trình. Đ Cooler, phải không?

Các loại tệp

Trong C, chúng ta chủ yếu làm việc với hai loại tệp:

  1. Tệp văn bản: Những tệp này chứa văn bản có thể đọc được bằng mắt thường. Hãy nghĩ về chúng như các tệp .txt bạn có thể tạo trong Notepad.
  2. Tệp nhị phân: Những tệp này chứa dữ liệu trong cùng định dạng như trong bộ nhớ. Chúng không được thiết kế để đọc trực tiếp bởi con người.

Đối với bài hướng dẫn này, chúng ta sẽ tập trung chủ yếu vào tệp văn bản, vì chúng dễ hiểu hơn cho người mới bắt đầu.

Con trỏ FILE: Chave để các thao tác tệp

Trước khi chúng ta có thể làm bất cứ điều gì với tệp, chúng ta cần giới thiệu một khái niệm rất quan trọng: con trỏ FILE. Hãy nghĩ về này như một biến đặc biệt hoạt động như một handle để tệp chúng ta muốn làm việc.

Đây là cách chúng ta khai báo một con trỏ FILE:

FILE *filePointer;

Đừng lo lắng quá nhiều về dấu sao (*) ở thời điểm này. Chỉ cần nhớ rằng khi chúng ta làm việc với tệp, chúng ta luôn cần khai báo một con trỏ FILE như này.

Mở (Tạo) một tệp

Bây giờ chúng ta đã có con trỏ FILE, hãy học cách mở một tệp. Chúng ta sử dụng hàm fopen() để làm điều này. Dưới đây là cú pháp cơ bản:

filePointer = fopen("filename.txt", "mode");

"mode" cho biết chúng ta muốn làm gì với tệp. Dưới đây là một số chế độ phổ biến:

Chế độ Mô tả
"r" Đọc: Mở một tệp để đọc (tệp phải tồn tại)
"w" Ghi: Tạo một tệp mới để ghi (nếu tệp tồn tại, nội dung của nó sẽ bị xóa)
"a" Thêm vào: Thêm vào một tệp (nếu tệp không tồn tại, nó sẽ được tạo ra)
"r+" Đọc và Ghi: Mở một tệp để đọc và ghi

Hãy xem một ví dụ:

FILE *filePointer;
filePointer = fopen("my_diary.txt", "w");

if (filePointer == NULL) {
printf("Oops! I couldn't create the file.");
return 1;
}

Trong đoạn mã này, chúng ta đang cố gắng mở (hoặc tạo) một tệp叫做 "my_diary.txt" để ghi. Câu lệnh if kiểm tra xem tệp có được mở thành công hay không. Nếu filePointer là NULL, điều đó có nghĩa là có điều gì đó đã xảy ra sai ( có thể là chúng ta không có quyền tạo tệp trong vị trí đó).

Đóng tệp

Khi chúng ta đã xong với một tệp, rất quan trọng là phải đóng nó. Điều này đảm bảo rằng tất cả các thay đổi của chúng ta được lưu và tệp được trả lại đúng cách cho hệ điều hành. Dưới đây là cách chúng ta làm điều đó:

fclose(filePointer);

Luôn nhớ đóng tệp của bạn! Điều này giống như tắt đèn khi bạn rời khỏi phòng - nó là một thói quen tốt để phát triển.

Ghi vào tệp văn bản

Bây giờ chúng ta biết cách mở và đóng tệp, hãy ghi một chút dữ liệu vào tệp của chúng ta. Chúng ta sẽ sử dụng hàm fprintf() để làm điều này, hàm này hoạt động tương tự như printf() nhưng nó ghi vào tệp thay vì console.

FILE *filePointer;
filePointer = fopen("my_diary.txt", "w");

if (filePointer == NULL) {
printf("Oops! I couldn't create the file.");
return 1;
}

fprintf(filePointer, "Dear Diary,\nToday I learned about file handling in C!\n");

fclose(filePointer);

Trong ví dụ này, chúng ta đang ghi hai dòng vào tệp của chúng ta. Dấu \n tạo ra một dòng mới, tương tự như khi chúng ta sử dụng printf().

Đọc từ tệp văn bản

Đọc từ một tệp cũng dễ dàng như ghi vào một tệp. Chúng ta sẽ sử dụng hàm fgets() để đọc các dòng từ tệp của chúng ta.

FILE *filePointer;
char buffer[100];

filePointer = fopen("my_diary.txt", "r");

if (filePointer == NULL) {
printf("Oops! I couldn't open the file.");
return 1;
}

while (fgets(buffer, sizeof(buffer), filePointer) != NULL) {
printf("%s", buffer);
}

fclose(filePointer);

Trong đoạn mã này, chúng ta đang đọc tệp line by line vào mảng buffer của chúng ta, và sau đó in mỗi line ra console. Vòng lặp while tiếp tục cho đến khi fgets() trả về NULL, điều này có nghĩa là chúng ta đã到达文件的末尾。

Xử lý tệp nhị phân

Trong khi chúng ta đã tập trung vào tệp văn bản cho đến nay, warto đề cập rằng C cũng cho phép chúng ta làm việc với tệp nhị phân. Những tệp này đặc biệt hữu ích khi chúng ta đang làm việc với các cấu trúc dữ liệu phức tạp hoặc khi chúng ta cần lưu trữ dữ liệu chính xác như trong bộ nhớ.

Dưới đây là một số hàm được sử dụng cho các thao tác tệp nhị phân:

Hàm Mô tả
fread() Đọc dữ liệu nhị phân từ tệp
fwrite() Ghi dữ liệu nhị phân vào tệp
fseek() Di chuyển đến một vị trí cụ thể trong tệp
ftell() Cho biết vị trí hiện tại trong tệp
rewind() Trở lại đầu của tệp

Chúng ta sẽ không đi vào chi tiết về những hàm này trong hướng dẫn người mới bắt đầu này, nhưng điều tốt là biết chúng tồn tại cho khi bạn sẵn sàng đối mặt với các thao tác tệp phức tạp hơn!

Đổi tên tệp

Cuối cùng, hãy học cách đổi tên một tệp. C cung cấp một hàm đơn giản gọi là rename() cho mục đích này.

int result = rename("old_name.txt", "new_name.txt");

if (result == 0) {
printf("File renamed successfully!");
} else {
printf("Oops! Something went wrong.");
}

Hàm này trả về 0 nếu việc đổi tên thành công và một giá trị không bằng 0 nếu có lỗi xảy ra.

Kết luận

Chúc mừng! Bạn đã chính thức bước vào thế giới của xử lý tệp trong C. Chúng ta đã bao gồm mở và đóng tệp, đọc và ghi vào tệp văn bản, và thậm chí đã触及 vào tệp nhị phân và đổi tên tệp.

Nhớ rằng, thực hành làm cho hoàn hảo. Thử tạo một chương trình đơn giản sử dụng các khái niệm này - có thể là một日记 kỹ thuật số hoặc một sổ địa chỉ cơ bản. Càng chơi với các hàm này, bạn sẽ càng thoải mái với xử lý tệp.

Tiếp tục mã hóa, tiếp tục học hỏi, và quan trọng nhất, hãy vui vẻ! Ai biết được? perhaps the next great app might just be hiding in the files you create!

Credits: Image by storyset