Domov Technika flush

flush



Přehled

Název funkce: fflush

Funkce: Vymazání vyrovnávací paměti pro čtení a zápis, když je třeba data ve výstupní vyrovnávací paměti okamžitě fyzicky zapsat

Soubor záhlaví: stdio.h

Prototyp: intfflush(FILE*stream)

kde stream je proud, který má být vyprázdněn

popis funkce h2>

Pokud ukazatel ukazuje na výstupní tok nebo aktualizační tok, jehož poslední operace není vstup, obnova výstupu vytvoří všechna nezapsaná data do toku, který bude zapsán do souboru a proudu, kde byla upravena nejnovější data. , A poslední změna stavu souboru by měla být označena jako časové razítko aktualizovaného základního souboru.

Pokud se u streamu, který je otevřen pro čtení pomocí základního popisu souboru, soubor ještě nenachází v EOF a soubor je prohledávatelný soubor, měl by být offset souboru základního popisu otevřeného souboru nastaven na proud Soubor umístění a všechny znaky posunuté zpět do streamu pomocí ungetc() nebo ungetwc(), které nebyly načteny ze streamu, budou zahozeny (žádné další změny offsetu souboru). [Konec možnosti]

Pokud je stream nulový ukazatel, funkce fflush() provede tuto operaci vyprázdnění u všech proudů s výše definovaným chováním.

Příklad programu

#include#include#include#includevoid flush(FILE *stream);int main(void){ FILE *stream; char msg[]="Thisisatest"; /*vytvořit soubor*/ stream=fopen("DUMMY.FIL","w");/*zapsat nějaká data do souboru*/ fwrite(charmsg,strlen(charmsg),1,stream); clrscr(); printf("PressanykeytoflushDUMMY.FlushDUMMY.FIL) "); getch();/*vyprázdnit data do DUMMY.FILbez zavření*/ flush(stream); printf("\nSoubor byl vyprázdněn,Pressanykey\toquit:"); voidstream(); 0 SOUBOR* lush() return{getch(); 0 int duphandle; /*vyprázdnění interního vyrovnávací paměti proudu*/ fflush(stream);/*makeaduplicatefilehandle*/ duphandle=dup(fileno(stream));/*zavřeteduplicatehandletavyprázdněníbufferu)*/ phandle(duphandle) 

Pokud je obnovení úspěšné, fflush vrátí 0. Pokud zadaný proud nemá vyrovnávací paměť nebo je otevřen pouze pro čtení, vrátí se také hodnota 0. Vrácení EOF znamená chybu.

Poznámka: Pokud fflush vrátí EOF, data mohla být ztracena kvůli chybě zápisu. Při nastavování důležité obslužné rutiny chyb je nejbezpečnější zavřít vyrovnávací paměť pomocí funkce setvbuf nebo použít nízkoúrovňové I/0 rutiny, jako je otevřít, zavřít a zapsat namísto proudových I/O funkcí.

Jiné použití

fflush(stdin) obnoví standardní vstupní vyrovnávací paměť a zahodí obsah vstupní vyrovnávací paměti [nestandardní]

< p>fflush(stdout) vyprázdní standardní výstupní vyrovnávací paměť a vytiskne obsah výstupní vyrovnávací paměti na standardní výstupní zařízení

Poznámky

Nikdy není definován ve standardech C a C++ Pass fflush(stdin ). Někdo by mohl říct: "Ale použil jsem flush(stdin) k vyřešení tohoto problému, jak můžete říct, že je to špatně?" Některé kompilátory (jako je VC6) skutečně podporují použití fflush(stdin) k vymazání vstupního bufferu, ale ne všechny kompilátory musí tuto funkci podporovat (gcc pod linuxem ji nepodporuje, testováno mým GCC 4.6.2), protože standard vůbec nedefinuje flush (stdin).

Dokument MSDN také jasně uvádí:

fflushoinputstreamjerozšířeníkstandarduC (vstupní tok pro operace flush je rozšířením standarduC).

Následující je definice funkce flush v C99:

intfflush(FILE*stream);

Pokud stream ukazuje na výstupní stream nebo aktualizační stream (updatestream) a poslední operace provedená tímto aktualizačním streamem není vložena, funkce fflush zapíše všechna nezapsaná data do souboru, na který stream ukazuje (např. standardní výstupní soubor stdout). V opačném případě není chování funkce flush definováno. fflush (NULL) vymaže všechny výstupní toky a aktualizační toky uvedené výše. Pokud dojde k chybě zápisu, funkce flush označí tyto proudy jako chybu a vrátí EOF, jinak vrátí 0.

Je vidět, že pokud proud ukazuje na vstupní proud (jako je stdin), pak chování funkce fflush není definováno. Proto je nesprávné používat fflush(stdin).

Tento článek je ze sítě, nereprezentuje pozici této stanice. Uveďte prosím původ dotisku
HORNÍ