Quản Lý Tệp Trong Ngôn Ngữ C

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;
}

Thẻ: C File-Management Buffering error-handling

Đăng vào ngày 9 tháng 9 lúc 21:46