Hướng dẫn dùng fflush stdin trong PHP

Hàm fflush() trong C

Hàm fflush() trong C được sử dụng để đẩy hết những ký tự có trong buffer ra stream. Sau khi gọi hàm fflush() thì buffer sẽ trống, đảm bảo việc nhập dữ liệu cho các biến sau an toàn. Để khai báo hàm fflush() trong C, ta sẽ cần sử dụng cú pháp như sau:

int fflush(FILE *stream)

Tham số:

  • Stream: con trỏ file.

Chú ý:

  • Hàm fflush() trả về 0 nếu xoá bộ nhớ đệm đầu ra của stream thành công.
  • Hàm fflush() trả về EOF nếu có lỗi.

2. Ví dụ về hàm fflush() trong C

Ví dụ dưới đây, sử dụng hàm fflush() trong C để xoá bộ nhớ đệm đầu ra của stream, giúp cho việc nhập các ký tự vào chương trình C một cách an toàn như sau:

#include int main() { fprintf(stdout, "Day la Laptrinhtudau. "); fflush(stdout); fprintf(stderr, "\nVi du ve ham fflush(). "); fprintf(stdout, "\nVi du nay su dung ngon ngu C. \n"); fflush(stdout); return 0; }

Kết quả:

Day la Laptrinhtudau.

Vi du ve ham fflush().

Vi du nay su dung ngon ngu C.


View Full Version : Cách dùng lệnh fflush(stdin)? Lệnh fflush(stdin) có tác dụng gì?



dehin

13-09-2010, 02:56 PM

Trong sách em viết: " Trc khi nhập dữ liệu kí tự hay xâu kí tự ta nên dùng lệnh"

fflush(stdin)
Các anh cho em hỏi lênh này dùng để làm gì, các công dụng, ứng dụng của nó.
Em xin cảm ơn!


mp121209

13-09-2010, 05:24 PM

stdin là dòng vào tiêu chuẩn(bàn phím). Các hàm scanf, gets, getchar ... đều nhận dữ liệu từ stdin.
Nếu trên stdin có đủ dữ liệu thì các hàm trên sẽ chỉ nhận một phần dữ liệu mà chúng yêu cầu. Phần dữ liệu còn lại(chưa được nhận) vẫn ở lại trên dòng nhập tiêu chuẩn(stdin)
Khi trên stdin không đủ dữ liệu theo yêu cầu của các hàm, thì máy sẽ tàm dừng để người sử dụng nhập thêm dữ liệu từ bàn phím lên stdin cho đến khi bấm Enter
Các hàm scanf, gets, getchar, ... thường chỉ nhận đủ số lượng dữ liệu mà nó yêu cầu, kí tự enter và các dữ liệu dư thừa trên dòng nhập tiêu chuẩn không được loại bỏ, nó có thể làm ảnh hưởng đến các phương thức sau đó. Ví dụ như '\n' còn lại sẽ làm trôi dạt gets, và getchar. Để các hàm này hoạt động đúng thì phải khử kí tự '\n' trong hàm scanf() bằng cách thêm đặc tả %*c vào cuối chuỗi điều khiển, hoặc dùng hàm fflush(stdin)
ffush: f là file, flush là đẩy(ra), loại ra. fflush(stdin) có chức năng làm sạch(tức là xóa) stdin. Dùng hàm này có thể tránh được hậu quả để lại của các thao tác nhập trước đó. fflush() được khai báo trong thư viện chuẩn
Bạn có thể xem thêm ở đây (http://www.cplusplus.com/reference/clibrary/cstdio/fflush/)
Một ví dụ nhỏ minh họa cho bạn dễ hiểu. Bạn có thể thử trong trường hợp dùng fflush() và không dùng fflush xem có gì khác nhau nhé:

/* fflush example */
#include

int main()
{
char ch;
char str [100];
printf ("Enter any charater: ");
scanf ("%c", &ch);
fflush (stdin);
printf ("Enter any string: ");
gets (str);
printf ("%c\n%s", ch, str);
return 0;
}


dehin

13-09-2010, 07:32 PM

Mấy giải thích trên của anh khó hiểu quá.
Dựa vào cái code của anh, em chạy thì em hiểu cũng đc sơ sơ.
Nếu ko có fflush(stdin) thì ở lênh gets(str) nó lấy luôn giá trị đã nhập ở scanf ("%c", &ch);
Sao nếu bỏ lệnh fflush(stdin) thì lệnh printf ("%c\n%s", ch, str); lại ko đc thực thi nhỉ? Chương trinhd dừng lại ngay ở dòng lênh nhập giá trị cho str
http://i837.photobucket.com/albums/zz299/dehin/Untitled.png


mp121209

13-09-2010, 09:35 PM

Bạn hiểu nhầm rồi, không phải là gets(str) lấy giá trị của scanf(ch) đâu. ở đây mình giải thích cho bạn rõ như thế này. Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets() như đã giải thích ở trên, vì thế str sẽ không nhận được giá trị nào hết! Giá trị s in ra ở dòng cuối là do lệnh printf() thực hiện, bạn có thể thay đổi lệnh printf trong chương trình kia thành thế này cho dễ hiểu nhé:

printf ("\n\n%c\n%s", ch, str);


Sayuri0903

13-09-2010, 09:55 PM

Bạn cứ hiểu là fflush có tác dụng xóa buffer. sau khi gọi nó thì buffer sẽ trống, đảm bảo việc nhập dữ liệu cho các biến sau an toàn.


dehin

13-09-2010, 10:06 PM

Em hiểu thê này có đúng ko anh?
VD: Với code trên ( ko có fflush(stdin) )
Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
Kết quả chương trình sẽ in ra:
http://i837.photobucket.com/albums/zz299/dehin/1-1.png

Ở giải thích của anh em ko hiểu ở thuật ngữ " trôi dạt" và đoạn có chữ " trôi dạt " đó.
" Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets()".
Tại sao lệnh scanf(ch) ở trên lại để lại '\n'. Em ko hiểu?


Sayuri0903

13-09-2010, 10:10 PM

Bạn nhớ rằng '\n' cũng là một ký tự. vậy nên nó cũng là một giá trị có thể lưu vào biến.
Khi bạn nhập giá trị. bạn sẽ nhấn vào 1 giá trị, và bắt buộc fai? nhấn enter. enter chính là '\n'
Có nhập chắc chắn fai? có lưu, vậy nó lưu vào đâu, buffer(bộ nhớ đệm).
Nguyên tắc của scanf là lấy từ buffer trước! nếu ko lấy đc thì mới chờ ng` nhập thêm.
"__Theo mình nghĩ là vậy. :|" kĩ năng chém gió :))


mp121209

14-09-2010, 03:57 AM

Em hiểu thê này có đúng ko anh?
VD: Với code trên ( ko có fflush(stdin) )
Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
Kết quả chương trình sẽ in ra:
http://i837.photobucket.com/albums/zz299/dehin/1-1.png

Ở giải thích của anh em ko hiểu ở thuật ngữ " trôi dạt" và đoạn có chữ " trôi dạt " đó.
" Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets()".
Tại sao lệnh scanf(ch) ở trên lại để lại '\n'. Em ko hiểu?
Trôi dạt tức là nó không được thực hiện đó bạn, tức là câu lệnh đó bỏ qua. Bạn hiểu cách thức làm việc của lệnh scanf() không nào? Nó đọc dữ liệu từ dòng nhập chuẩn(tức là bàn phím do bạn gõ vào), đọc đầy dữ liệu thì dừng. '\n' là một dấu hiệu đặc biệt để sanf() dừng đọc dữ liệu. Ví dụ bạn khai báo char str[20]; //tức là một chuỗi chứa được 19 kí tự, nhưng khi thực hiện lệnh scanf("%s",str); mà bạn chỉ nhập vào 12345 rồi bấm enter, thì str = "12345" còn enter sẽ ở lại trên dòng nhập. Trường hợp bạn nhập vào một chuỗi nhiều hơn 19 kí tự thì scanf() đọc hết 19 kí tự và bỏ lại những kí tự thừa trên dòng nhập như trong hình minh họa của bạn. Bạn hiểu như thế là đúng rồi đấy!


zo.vn_si

04-01-2012, 07:27 AM

Em hiểu thê này có đúng ko anh?
VD: Với code trên ( ko có fflush(stdin) )
Nếu nhập ở scanf(ch) là 4242 thì ch chỉ nhận giá trị là '4'
Còn dữ liệu thừa là '242' vẫn còn ở trên stdin.
Ở lệnh scanf(str) do trên stdin vẫn còn có đủ dữ liệu nên str đc lấy luôn là '242'
Kết quả chương trình sẽ in ra:
http://i837.photobucket.com/albums/zz299/dehin/1-1.png

Bạn đã hiểu rõ vấn đề rồi đấy.


boss14420

04-01-2012, 09:56 AM

theo chuẩn thì fflush chỉ dành cho output stream, dùng để đẩy hết những kí tự có trong buffer ra stream. VD fflush(stdout).
Chuẩn của C không yêu cầu về fflush sẽ làm gì với input stream, một số implement thì quyết định là nó sẽ xoá sạch buffer, một số thì không làm gì cả.
Cho nên nếu muốn chương trình chạy được trên nhiều HDH thì không nên xoá buffer bằng lệnh này.

http://diendan.congdongcviet.com/showthread.php?t=42732&page=2
www.gidnetwork.com/b-57.html


nguyen tan cuong

04-01-2012, 11:32 AM

Trong sách em viết: " Trc khi nhập dữ liệu kí tự hay xâu kí tự ta nên dùng lệnh"

fflush(stdin)
Các anh cho em hỏi lênh này dùng để làm gì, các công dụng, ứng dụng của nó.
Em xin cảm ơn!

cái hàm fflush() này hồi lúc mới học mình cũng mập mờ về nó lắm. Nhưng cố gắn tìm hiểu rồi mới vỡ lẽ ồ sao mà dễ thế.
Thật ra là thế này: khi mở và ghi file thì dữ có thể bị sót lại nên ta thường dùng fflush() để cho dữ liệu được đẩy vào file luôn. Nếu không dùng fflush() thì khi gọi fclose() thì dữ liệu cũng tự được ghi nốt.
Một công dụng nữa là: Khi bạn nhập dữ liệu từ bàn phím và đọc nó bằng một hàm vd scanf() thì dữ liệu một phần được đọc còn lại thì chưa đọc hết. Nên dùng fflush() để dọn dẹp nói đi.


SolitaryWolf

16-09-2012, 06:04 PM

Cho mình hỏi bộ đệm bàn phím và input stream là 1 hả?


kingsleyfpt

05-11-2015, 02:23 AM

Bạn hiểu nhầm rồi, không phải là gets(str) lấy giá trị của scanf(ch) đâu. ở đây mình giải thích cho bạn rõ như thế này. Nếu không dùng fflush(stdin) thì '\n' do lệnh scanf() để lại trên dòng nhập làm trôi dạt phương thức gets() như đã giải thích ở trên, vì thế str sẽ không nhận được giá trị nào hết! Giá trị s in ra ở dòng cuối là do lệnh printf() thực hiện, bạn có thể thay đổi lệnh printf trong chương trình kia thành thế này cho dễ hiểu nhé:

printf ("\n\n%c\n%s", ch, str);

Theo em hiểu thì đây là thừa kí tự enter của dòng scanf trước đó chứ đâu phải \n nhỉ


daokimhoa

06-07-2021, 09:44 AM

Tính ra hàm này cũng có chức năng dọn rác từ ứng dụng mà nhà mình tạo ra khi chạy nhỉ


vBulletin® Version 4.2.2, Copyright © 2022 vBulletin Solutions, Inc. All rights reserved. Administer by Kevin Hoang