×

Đọc dữ liệu từ tập tin vào bộ nhớ với hàm fread() trong C

Khi làm việc với ngôn ngữ lập trình C, việc xử lý dữ liệu từ tập tin là một nhiệm vụ quan trọng và thiết yếu. Một trong những hàm phổ biến nhất để đọc dữ liệu từ tập tin vào bộ nhớ là hàm fread(). Trong bài viết này, chúng ta sẽ cùng tìm hiểu cách sử dụng hàm này, những đặc điểm nổi bật của nó, và cách áp dụng vào các tình huống thực tế.

Khái niệm về hàm fread()

fread() là một hàm chuẩn trong thư viện C STL (Standard Library), được sử dụng để đọc dữ liệu từ một tập tin vào bộ nhớ đệm. Hàm này nằm trong thư viện stdio.h và có cú pháp như sau:

size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
  • ptr: Con trỏ đến vùng nhớ nơi dữ liệu đọc được sẽ được lưu trữ.
  • size: Kích thước của mỗi phần tử cần đọc, tính bằng bytes.
  • count: Số lượng phần tử cần đọc.
  • stream: Con trỏ đến cấu trúc FILE đại diện cho tập tin cần đọc.

Hàm trả về số lượng phần tử thực sự đã đọc được, nếu nhỏ hơn count có thể do gặp lỗi hoặc đạt cuối tập tin.

Ví dụ cơ bản

Để hiểu rõ hơn về cách sử dụng hàm fread(), hãy cùng xem qua một ví dụ đơn giản. Giả sử chúng ta có một tập tin nhị phân chứa các số nguyên và muốn đọc chúng vào một mảng trong bộ nhớ.

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file = fopen("numbers.bin", "rb");
    if (file == NULL) {
        perror("Unable to open file");
        return 1;
    }

    // Xác định kích thước của tập tin
    fseek(file, 0, SEEK_END);
    long fileSize = ftell(file);
    rewind(file);

    // Tính số lượng phần tử trong tập tin
    size_t numElements = fileSize / sizeof(int);

    // Cấp phát bộ nhớ cho mảng
    int *buffer = (int *)malloc(fileSize);
    if (buffer == NULL) {
        perror("Memory allocation failed");
        fclose(file);
        return 1;
    }

    // Đọc dữ liệu từ tập tin vào mảng
    size_t elementsRead = fread(buffer, sizeof(int), numElements, file);
    if (elementsRead != numElements) {
        perror("Reading error");
        free(buffer);
        fclose(file);
        return 1;
    }

    // Hiển thị các phần tử đã đọc được
    for (size_t i = 0; i < numElements; i++) {
        printf("%d\n", buffer[i]);
    }

    // Giải phóng tài nguyên
    free(buffer);
    fclose(file);
    return 0;
}

Giải thích từng bước

  1. Mở tập tin: Sử dụng hàm fopen() với chế độ "rb" (read binary) để mở tập tin nhị phân.
  2. Xác định kích thước của tập tin: Sử dụng các hàm fseek(), ftell(), và rewind() để tính kích thước của tập tin.
  3. Tính số lượng phần tử: Dựa trên kích thước của tập tin và kích thước của kiểu dữ liệu (ở đây là int).
  4. Cấp phát bộ nhớ: Sử dụng malloc() để cấp phát bộ nhớ cho mảng sẽ chứa các phần tử.
  5. Đọc dữ liệu từ tập tin: Sử dụng fread() để đọc các phần tử từ tập tin vào mảng.
  6. Hiển thị dữ liệu: Duyệt mảng và in ra các giá trị đã đọc được.
  7. Giải phóng tài nguyên: Sử dụng free() để giải phóng bộ nhớ đã cấp phát và fclose() để đóng tập tin.

Những lưu ý khi sử dụng fread()

  • Kiểm tra lỗi: Luôn kiểm tra giá trị trả về của fread() để xử lý các trường hợp đọc không thành công.
  • Quản lý bộ nhớ: Đảm bảo cấp phát và giải phóng bộ nhớ đúng cách để tránh rò rỉ bộ nhớ.
  • Định dạng dữ liệu: Xác định đúng định dạng và kích thước của dữ liệu khi đọc để tránh sai sót.

Kết luận

Bằng cách hiểu và áp dụng hàm fread(), bạn có thể dễ dàng đọc dữ liệu từ tập tin vào bộ nhớ trong các chương trình viết bằng ngôn ngữ C. Việc làm chủ các kỹ thuật cơ bản liên quan đến I/O (Input/Output) sẽ giúp bạn tạo ra các ứng dụng mạnh mẽ và hiệu quả hơn.

Comments