Yleiskatsaus
Toiminnon nimi: fflush
Toiminto: Tyhjennä luku- ja kirjoituspuskuri, kun lähtöpuskurissa olevat tiedot on kirjoitettava fyysisesti välittömästi
Otsikkotiedosto: stdio.h
Prototyyppi: intfflush(TIEDOSTO*virta)
jossa virta on huuhdeltava virta
funktion kuvaus h2>
Jos osoitin osoittaa tulosvirtaan tai päivitysvirtaan, jonka viimeisin toiminto ei ole syöte, tulosteen päivitys luo kirjoittamattomat tiedot kirjoitettavaan virtaan tiedostoon ja streamiin, jossa viimeisimmät tiedot on muokattu. , Ja viimeinen tiedoston tilan muutos tulee merkitä päivitetyn perustiedoston aikaleimaksi.
Jos tiedosto ei ole vielä EOF:ssä ja tiedosto on haettavissa oleva tiedosto, virran, joka avataan lukemista varten perustiedoston kuvauksen avulla, avatun tiedoston peruskuvauksen tiedostosiirtymä tulee asettaa virraksi. sijainti, ja kaikki merkit, jotka ungetc()- tai ungetwc()-toiminnolla on työnnetty takaisin streamiin, joita ei ole luettu virrasta, hylätään (ei muita muutoksia tiedostosiirtymään). [vaihtoehdon loppu]
Jos virta on nollaosoitin, fflush() suorittaa tämän huuhtelun kaikille virroille yllä määritellyllä tavalla.
Ohjelmaesimerkki
#include#include#include#includevoid flush(FILE *stream);int main(void){ FILE *stream; char msg[]="Tämä testi"; /*luotiedosto*/ stream=fopen("DUMMY.FIL","w");/*kirjoittaa tiedostoon tietoja*/ fwrite(charmsg,strlen(charmsg),1,stream); clrscr(); printf("PressanykeytoflushDUMMY.FlushDUMMY.FIL)"); getch();/*flushthedatatoDUMMY.FILwithout Closingit*/ flush(stream); printf("\nTiedosto huuhdeltu,Pressanykey\toquit:"); voidstream(); 0 TIEDOSTO* lush() return{getch(); 0 int duphandle; /*flushthestream'sinternalbuffer*/ fflush(stream);/*makeaduplicatefilehandle*/ duphandle=dup(fileno(stream));/*sulje kaksoiskappalekahvan huuhtele puskuri)*/ phandle(duphandle)Jos päivitys onnistuu, fflush palauttaa 0. Jos määritetyllä virralla ei ole puskuria tai se on vain luku -tilassa, palautetaan myös arvo 0. EOF:n palauttaminen tarkoittaa virhettä.
Huomaa: Jos fflush palauttaa EOF:n, tiedot ovat saattaneet kadota kirjoitusvirheen vuoksi. Tärkeää virhekäsittelijää määritettäessä on turvallisinta sulkea puskuri setvbuf-toiminnolla tai käyttää matalan tason I/0-rutiineja, kuten avaus-, sulkemis- ja kirjoitusvirta-I/O-toimintojen sijaan.
Muu käyttö
fflush(stdin) päivittää vakiosyöttöpuskurin ja hylkää syöttöpuskurin sisällön [ei-standardi]
< p>fflush(stdout) tyhjentää vakiotulostuspuskurin ja tulostaa lähtöpuskurin sisällön vakiotulostuslaitteeseen.Huomautuksia
Se ei ole koskaan määritelty C- ja C++-standardeissa Pass fflush(stdin ). Joku saattaa sanoa: "Mutta käytin flush(stdin):tä tämän ongelman ratkaisemiseen, kuinka voit sanoa, että se on väärin?" Todellakin, jotkut kääntäjät (kuten VC6) tukevat fflush(stdin)-toimintoa syöttöpuskurin tyhjentämiseen, mutta kaikkien kääntäjien ei tarvitse tukea tätä ominaisuutta (gcc Linuxissa ei tue sitä, testattu GCC 4.6.2:llani), koska standardi ei määrittele fflush (stdin) ollenkaan.
MSDN-asiakirjassa sanotaan myös selvästi:
fflushoninputstream onC-standardin laajennus (flush-toiminnon syöttövirta on C-standardin laajennus).
Seuraava on tyhjennysfunktion määritelmä C99:ssä:
intfflush(TIEDOSTO*virta);
Jos virta osoittaa ulostulovirtaan tai päivitysvirtaan (updatestream) ja tämän päivitysvirran viimeisintä toimintoa ei syötetä, fflush-toiminto kirjoittaa kaikki kirjoittamattomat tiedot tiedostoon, johon virta osoittaa (esim. vakiotulostetiedosto stdout). Muuten huuhtelutoiminnon käyttäytyminen on määrittelemätön. fflush (NULL) tyhjentää kaikki lähtövirrat ja yllä mainitut päivitysvirrat. Jos kirjoitusvirhe tapahtuu, huuhtelutoiminto merkitsee kyseiset virrat virheiksi ja palauttaa EOF:n, muuten se palauttaa 0:n.
Voidaan nähdä, että jos virta osoittaa tulovirtaan (kuten stdin), tyhjennysfunktion käyttäytyminen on määrittelemätön. Siksi on väärin käyttää fflush(stdin).