Общ преглед
Име на функцията: fflush
Функция: Изчистване на буфера за четене и запис, когато данните в изходния буфер трябва да бъдат физически записани незабавно
Заглавен файл: stdio.h
Прототип: intfflush(FILE*stream)
където поток е потокът, който трябва да бъде изчистен
описание на функцията h2>
Ако указателят сочи към изходен поток или поток за актуализиране, чиято последна операция не е вход, изходното опресняване ще създаде всички незаписани данни в потока, които ще бъдат записани към файла и потока, където са били променени най-новите данни. , И последната промяна на състоянието на файла трябва да бъде маркирана като клеймо за време на актуализирания основен файл.
За поток, който е отворен за четене с помощта на основното описание на файла, ако файлът все още не е в EOF и файлът е файл с възможност за търсене, файловото отместване на основното описание на отворен файл трябва да бъде зададено на потока Файлът местоположение и всички знаци, върнати обратно към потока от ungetc() или ungetwc(), които не са били прочетени от потока, ще бъдат отхвърлени (без допълнителни промени в отместването на файла). [Край на опцията]
Ако потокът е нулев указател, fflush() ще извърши тази операция за изчистване на всички потоци с поведението, дефинирано по-горе.
Пример на програма
#include#include#include#includevoid flush(FILE *stream);int main(void){ FILE *stream; char msg[]="Този тест"; /*createafile*/ stream=fopen("DUMMY.FIL","w");/*записва някои данни във файла*/ fwrite(charmsg,strlen(charmsg),1,stream); clrscr(); printf("PressanykeytoflushDUMMY.FlushDUMMY.FIL) "); getch();/*промиване на данните в DUMMY.FILбез затваряне*/ промиване(поток); printf("\nФайлът е изчистен, Натиснете произволен клавиш\за излизане:"); voidstream(); 0 ФАЙЛ* lush() return{getch(); 0 int duphandle; /*flushthestream'sinternalbuffer*/ fflush(stream);/*makeaduplicatefilehandle*/ duphandle=dup(fileno(stream));/*closetheduplicatehandletoflushthebuffer)*/ phandle(duphandle)Ако опресняването е успешно, fflush връща 0. Ако посоченият поток няма буфер или е отворен само за четене, също се връща стойност 0. Връщането на EOF показва грешка.
Забележка: Ако fflush върне EOF, данните може да са загубени поради грешка при запис. Когато настройвате важен манипулатор на грешки, най-безопасно е да затворите буфера с функцията setvbuf или да използвате I/0 рутинни процедури на ниско ниво, като отваряне, затваряне и запис, вместо I/O функции за поток.
Друго използване
fflush(stdin) опреснява стандартния входен буфер и отхвърля съдържанието на входния буфер [нестандартен]
< p>fflush(stdout) изчиства стандартния изходен буфер и отпечатва съдържанието на изходния буфер на стандартното изходно устройствоБележки
Никога не се дефинира в стандартите C и C++ Pass fflush(stdin ). Някой може да каже: "Но аз използвах flush(stdin), за да реша този проблем, как можете да кажете, че е грешно?" Наистина, някои компилатори (като VC6) поддържат използването на fflush(stdin) за изчистване на входния буфер, но не всички компилатори трябва да поддържат тази функция (gcc под linux не я поддържа, тествано от моя GCC 4.6.2), защото стандартът изобщо не дефинира fflush (stdin).
Документът на MSDN също ясно посочва:
fflushoninputstream е разширение към C стандарта (fflush операция входен поток е разширение на C стандарта).
Следва дефиницията на функцията fflush в C99:
intfflush(ФАЙЛ*поток);
Ако потокът сочи към изходен поток или поток за актуализиране (updatestream) и най-новата операция, извършена от този поток за актуализиране, не е въведена, така че функцията fflush ще запише всички незаписани данни във файла, към който сочи потокът (като напр. стандартния изходен файл stdout). В противен случай поведението на функцията fflush е недефинирано. fflush (NULL) изчиства всички изходни потоци и потоците за актуализиране, споменати по-горе. Ако възникне грешка при запис, функцията за промиване ще маркира тези потоци като грешка и ще върне EOF, в противен случай връща 0.
Може да се види, че ако потокът сочи към входен поток (като stdin), тогава поведението на функцията fflush е недефинирано. Следователно е неправилно да се използва fflush(stdin).