×

Đẩy dữ liệu trong bộ đệm ra thiết bị đầu ra với fflush() trong C

Trong lập trình C, việc làm việc với tệp và luồng dữ liệu (streams) thường xuyên gặp phải vấn đề liên quan đến bộ đệm. Các hàm đọc/ghi trong C thường không trực tiếp thực hiện trên thiết bị đầu ra mà lưu dữ liệu vào bộ đệm trước. Điều này giúp cải thiện hiệu suất, tuy nhiên đôi khi điều này lại không mong muốn. Để giải quyết vấn đề này, hàm fflush() được sử dụng để đẩy (flush) dữ liệu trong bộ đệm ra thiết bị đầu ra.

Bộ đệm và lý do cần sử dụng bộ đệm

Bộ đệm (buffer) trong C đóng vai trò trung gian giữa chương trình và thiết bị đầu ra. Khi bạn ghi dữ liệu ra một tệp hoặc màn hình, dữ liệu không lập tức được gửi đi mà được lưu vào bộ đệm. Nhờ vậy, số lần truy cập vào thiết bị đầu ra giảm xuống đáng kể, giúp tối ưu hiệu suất.

Hoạt động của fflush()

Hàm fflush(FILE *stream) trong thư viện chuẩn C có nhiệm vụ đẩy toàn bộ nội dung của bộ đệm liên quan tới luồng stream ra thiết bị đầu ra thực sự. Điều này đảm bảo rằng tất cả dữ liệu được lưu trữ tạm thời trong bộ đệm sẽ được ghi ra đích đến mong muốn.

#include <stdio.h>

int main() {
    FILE *file = fopen("example.txt", "w");
    if (file == NULL) {
        perror("Failed to open file");
        return 1;
    }

    fprintf(file, "This is an example.\n");
    fflush(file); // Đẩy dữ liệu trong bộ đệm ra tệp

    fclose(file);
    return 0;
}

Các trường hợp sử dụng fflush()

  • Ghi tệp thường xuyên: Khi bạn muốn đảm bảo rằng dữ liệu trong bộ đệm được ghi ra tệp ngay lập tức, đặc biệt trong các ứng dụng ghi nhật ký, bạn sẽ cần sử dụng fflush().
  • Lập trình mạng: Khi làm việc với socket, việc cập nhật ngay lập tức thông qua fflush() trở nên cần thiết để gửi gói tin qua mạng mà không bị trễ.
  • Chương trình tương tác với người dùng: Nếu chương trình yêu cầu người dùng nhập dữ liệu và sau đó in ra kết quả ngay lập tức, bạn sử dụng fflush(stdout) để đảm bảo rằng dữ liệu ngay lập tức hiển thị lên màn hình.

Lưu ý quan trọng

  • Khi streamNULL, tất cả các luồng đầu ra được đẩy ra thiết bị đầu ra tương ứng.
  • Sử dụng fflush(stdin) là không chuẩn hóa (undefined behavior) và nên tránh vì nó có thể gây lỗi trên nhiều hệ thống khác nhau.
#include <stdio.h>

int main() {
    printf("Enter your name: ");
    fflush(stdout); // Đẩy nội dung bộ đệm stdout ra giao diện người dùng

    char name[50];
    fgets(name, 50, stdin);

    printf("Hello, %s", name);
    return 0;
}

Kết luận

Việc sử dụng hàm fflush() đúng cách rất quan trọng trong lập trình C để đảm bảo tính nhất quán và hiệu suất của chương trình. Đặc biệt trong các hệ thống yêu cầu phản hồi nhanh và liên tục, fflush() trở thành công cụ đắc lực để kiểm soát hoạt động của bộ đệm và luồng dữ liệu.

Comments