Khái Niệm Cơ Bản Về Quản Lý Tệp
Tại sao sử dụng tệp?
Tệp được lưu trữ trong bộ nhớ: Khi chương trình kết thúc hoặc mất điện => Dữ liệu bị mất.
Tệp được lưu trữ trên ổ cứng: Dữ liệu vẫn còn ngay cả khi chương trình kết thúc hoặc mất điện.
Phân Loại Tệp
- Tệp Chương Trình: Gồm các tệp mã nguồn (có đuôi .c), tệp đối tượng (.obj) và tệp thực thi (.exe).
- Tệp Dữ Liệu: Là nơi mà chương trình có thể đọc và ghi dữ liệu, thường được lưu trữ trên ổ cứng.
Tên Tệp
Tên tệp bao gồm ba phần: Đường dẫn + Tên tệp chính + Phần mở rộng. Ví dụ: c:\\code\\test.txt.
Tệp Văn Bản Và Tệp Nhị Phân
- Tệp văn bản: Lưu trữ thông tin dưới dạng ký tự ASCII.
- Tệp nhị phân: Lưu trữ thông tin dưới dạng nhị phân không cần chuyển đổi.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {
int num = 10000;
FILE* filePtr = fopen("data.bin", "wb");
fwrite(&num, sizeof(int), 1, filePtr);
fclose(filePtr);
return 0;
}
Mở Và Đóng Tệp
Dòng Chảy (Stream)
Là một khái niệm trừu tượng biểu diễn dòng dữ liệu giữa thiết bị đầu vào và đầu ra.
Dòng Chuẩn
- stdin: Dòng nhập chuẩn, lấy từ bàn phím.
- stdout: Dòng xuất chuẩn, hiển thị lên màn hình.
- stderr: Dòng lỗi chuẩn, cũng hiển thị lên màn hình.
#include <stdio.h>
int main() {
fputc('A', stdout);
fputc('B', stdout);
return 0;
}
Con Trỏ Tệp
Khi mở tệp, trả về một con trỏ FILE* đại diện cho tệp đó.
Hàm Mở Và Đóng Tệp
#include <stdio.h>
int main() {
FILE* filePtr = fopen("example.txt", "w");
if (filePtr == NULL) {
perror("fopen");
return 1;
}
fclose(filePtr);
return 0;
}
Đọc Và Ghi Tệp Theo Thứ Tự
Hàm Đọc Và Ghi Tuần Tự
| Hàm | Công Dụng | Áp Dụng Cho |
|---|---|---|
| fgetc | Đọc từng ký tự | Dòng nhập |
| fputc | Ghi từng ký tự | Dòng xuất |
| fgets | Đọc từng dòng | Dòng nhập |
| fputs | Ghi từng dòng | Dòng xuất |
Ví Dụ Sử Dụng fgetc
#include <stdio.h>
int main() {
FILE* filePtr = fopen("input.txt", "r");
if (filePtr == NULL) {
perror("fopen");
return 1;
}
int count = 0;
int ch;
while ((ch = fgetc(filePtr)) != EOF) {
if (ch == 'X') count++;
}
printf("Tổng số ký tự X là: %d\n", count);
fclose(filePtr);
return 0;
}
Ví Dụ Sử Dụng fputc
#include <stdio.h>
int main() {
FILE* filePtr = fopen("output.txt", "w");
if (filePtr == NULL) {
perror("fopen");
return 1;
}
for (char letter = 'a'; letter <= 'z'; letter++) {
fputc(letter, filePtr);
}
fclose(filePtr);
return 0;
}
Xử Lý Lỗi Và Kết Thúc Đọc Tệp
Hàm feof và ferror
#include <stdio.h>
int main() {
FILE* filePtr = fopen("sample.txt", "r");
if (!filePtr) {
perror("File opening failed");
return -1;
}
int ch;
while ((ch = fgetc(filePtr)) != EOF) putchar(ch);
if (ferror(filePtr)) puts("I/O error when reading");
else if (feof(filePtr)) puts("End of file reached successfully");
fclose(filePtr);
return 0;
}
Bộ Nhớ Đệm Của Tệp
Bộ nhớ đệm giúp quản lý việc đọc và ghi dữ liệu hiệu quả hơn.
#include <stdio.h>
int main() {
FILE* filePtr = fopen("buffer.txt", "w");
fputs("Hello World", filePtr);
fflush(filePtr); // Làm mới bộ nhớ đệm
fclose(filePtr);
return 0;
}