Skip to main content

C Programming - fflush function and output stream!

Ai đã từng lập trình C hẳn rất quen thuộc với hàm fflush. Nhưng các bạn thường hiểu nhầm công dụng của nó.
fflush là hàm "chỉ" dùng để xóa bộ đệm dòng ra(output stream), khi sử dụng với dòng vào(input stream) thì sẽ gây ra sự vận hành không xác định của các chương trình(behave undefine). Nhưng thường thì chúng ta lại dùng để xóa dòng vào chuẩn(stdin) với suy nghĩ loại bỏ những thứ không mong đợi được đưa vào từ bàn phím khi chạy chương trình.

vd: fflush(stdin); fgets(name); đó là một sai lầm rất ngớ ngẩn vì đơn giản fflush không dùng cho các dòng vào và có thể gây ra những lỗi không ngờ tới.
Để giải thích công dụng của fflush mình xin đưa ra một đoạn code đơn giản sau:
Trường hợp 1:
#include "stdio.h"
#include "stdlib.h"

int main(void)
{
int i;
for(i = 0;i < 10; i++)
{
printf("%d", i);
sleep(1);
}
return 0;
}

Trường hợp 2: Vẫn đoạn code đó nhưng thêm hàm fflush(stdout); ngay sau hàm print.

Trường hợp 3: Bỏ hàm fflush(stdout) và thay hàm printf thành printf("%d\n", i);

Chạy 3 đoạn chương trình đó và bạn sẽ thấy sự khác biệt rất thú vị. Hàm sleep(1) dùng để dừng chương trình 1s(không làm gì trong 1s này cả). Ở trường hợp thứ nhất, tất cả kí tự được in ra cùng 1 lúc sau 10s chạy chương trình, lí do là hàm printf chỉ đơn giản đưa các kí tự cần in ra màn hình vào stdout và chỉ in ra màn hình khi stdout được làm đầy hoặc không còn kí tự nào được đưa vào stdout nữa khi chương trình kết thúc, hoặc gặp kí tự xuống dòng(trường hợp 3). Ở trường hợp 2, hàm fflush(stdout) đưa tất cả kí tự được chứa trong stdout ra màn hình(làm sạch stdout).

Comments

  1. ấy , bây giờ mới để ý stdin ,stdout là stream vào và ra .

    Cám ơn Hiệp đã nhắc và gợi mở kiến thức .

    ReplyDelete
  2. mà hàm sleep() trong thư viện dos.h thì phải

    ReplyDelete
  3. bớt thì phải đi nhá Chung.
    cái này biết lâu rồi. Vote up :D

    ReplyDelete
  4. @Chung: Đoạn code trên có include cái thư viện nào gọi là "dos.h" không? sleep là hàm trong thư viện stdlib.h

    ReplyDelete
  5. Nhưng mà trên win thì fflush(stdin) có tác dụng thật là sao ? Tại complie KHÔNG chuẩn à?

    ReplyDelete
  6. Cậu có ví dụ cụ thể nào cho fflush(stdin) để minh họa nó bất lực không :D

    ReplyDelete
  7. Biên dịch đoạn code sau và chạy:
    ...
    main()
    {
    char c;
    sleep(5);
    printf("Nhap:");
    fflush(stdin);
    c = fgetc(stdin);
    return 0;
    }

    Sau khi chạy chương trình ấn bừa các phím và hàm fgetc sẽ bị trôi, nhưng mà nhớ là phải biên dịch bằng trình biên dịch C chuẩn đấy, còn không chuẩn thì tớ không biết :)).

    ReplyDelete
  8. Mà nhớ phải ấn enter nữa, vì khi chưa ấn enter thì kí tự chưa được chuyển đến bộ đệm.

    ReplyDelete

Post a Comment

Popular posts from this blog

Tài liệu và hướng dẫn học Python

Để tiết kiệm thời gian, tốt nhất là đi học PyMI Updated: 130617 Sau đây là các tài liệu khuyên dùng: Vì nhiều lý do, nên học python2.7 tại thời điểm hiện tại (giờ là tháng 6/2013 - muốn biết tại sao thì tự tìm hiểu) python 3.5+ (giờ là tháng 2/2017) Chuẩn bị: 1. biết bật tắt máy 2. biết cài python 3. tập gõ 10 ngón - gõ 2 ngón hay 1 ngón cũng không sao, nhưng 10 ngón là cách dễ nhất để gõ nhanh nhất. Tài liệu - Nên dùng tài liệu tại trang chủ của Python làm chính, tham khảo thêm các tài liệu khác tại http://www.familug.org/2016/12/free-ebook.html Căn bản, mới học 1.1 Python PyMI.vn https://pymi.vn/tutorial/ 1.2. Python offical tutorial kết hợp làm bài tập trên HackerRank  (đề bài bằng tiếng Anh, nhưng Google translate 1 lúc cũng ra vì có nhiều ví dụ mẫu đi kèm). Học viên của Pymi.vn có rất nhiều học viên đã tự học với Learn Python the hard way nhưng chưa thấy ai thành công cả. Hai link dưới nên đọc sau khi đã nắm được những phần cơ bản của ngôn ngữ pytho...

The PyMiers

New FAMILUG