Siirry sisältöön

C/Standardikirjastot/stdio.h

Wikikirjastosta
#include <stdio.h>

Kirjasto I/O- eli siirräntätarkoituksiin.

size_t, NULL: ks. stddef.h

stdio.h:n tärkein abstraktio on tietovirrat, joiden tietotyyppi on FILE. Kyseistä tietotyyppiä tulee käyttää vain osoittimissa; muuttujilla ei saa olla tyyppiä FILE (vaan FILE *), eikä koodin pidä suoraan yrittää käyttää sen kenttiä.

Joistain tietovirroista voi vain lukea tietoja (lukuvirta), toisiin voi vain kirjoittaa tietoja (kirjoitusvirta), ja joillakin virroilla molemmat toiminnot ovat mahdollisia (luku- ja kirjoitusvirta).

Teksti- ja binääridata

[muokkaa | muokkaa wikitekstiä]

Tietovirrat voivat toimia sekä teksti- että binääritilassa. Tekstitilassa merkit, esimerkiksi rivinvaihdot, sovitetaan automaattisesti käyttöjärjestelmän käyttämään merkkisarjaan. Joissain vanhoissa käyttöjärjestelmissä teksti- ja binääritiedostot erotettiin toisistaan kokonaan.

Standardi vaatii, että tekstirivien pituus saa olla vähintään 254 merkkiä.

Tietovirta voidaan kytkeä sitä luotaessa järjestelmässä olevaan tiedostoon.

Tietovirroilla on lisäksi kaksi ilmaisinta: lopunilmaisin (engl. end-of-file indicator) ja virheenilmaisin (engl. error indicator). Lopunilmaisin kytketään päälle tapauksissa, jossa tiedostosta on yritetty lukea tietoa, vaikka tieto on jo luettu loppuun. Virheenilmaisin kytketään päälle, kun tapahtuu jonkinlainen I/O-virhe tiedostoa luettaessa tai siihen kirjoitettaessa.

C-kirjaston toteutus saattaa puskuroida tietovirtojen dataa. Puskurointitiloja on kolme:

  • täyspuskurointi: luku- ja kirjoituspyynnöt etenevät järjestelmälle vasta, kun puskuri täyttyy.
  • rivipuskurointi: luku- ja kirjoituspyynnöt etenevät järjestelmälle, kun puskuri täyttyy, tai jos puskuriin tulee rivinvaihtomerkki.
  • ei puskurointia: luku- ja kirjoituspyynnöt etenevät järjestelmälle suoraan.

Standardivirrat

[muokkaa | muokkaa wikitekstiä]

C-ohjelmalla on kolme standardivirtaa: standardisyöte (stdin), standardituloste (stdout) ja standardivirhetuloste (stderr). Näistä ensimmäisestä voi vain lukea, kun jälkimmäiseen kahteen voi vain kirjoittaa.

Jos ohjelmaa esimerkiksi ajetaan päätteeltä, standardisyöte lukee käyttäjän päätteeseen syöttämää tekstiä, ja molemmat tulosteet tulostavat tekstiä ruudulle. Standardisyöte ja standardituloste ovat oletuksena rivipuskuroitu, jos laite on näyttöpääte, ja täysin puskuroitu, jos ne ovat esimerkiksi ohjattu tiedostoon. Standardivirhetulostetta ei oletuksena puskuroida ollenkaan.

Nyrkkisääntönä on, että standarditulosteeseen laitetaan tulokset, ja standardivirhetulosteeseen virheviestit.

Makrot ja tyypit

[muokkaa | muokkaa wikitekstiä]
FILE

on tietovirtatyyppi. FILE:ä tulee käyttää vain osoittimissa; muuttujilla ei saa olla tyyppiä FILE (vaan FILE *), eikä koodin pidä suoraan yrittää käyttää sen kenttiä.

fpos_t

on tietotyyppi, jolla voidaan yksilöllisesti tallettaa ja palauttaa kohdistimen sijainti tiedostossa.

_IOFBF
_IOLBF
_IONBF

ovat vakioita, joita käytetään puskuritilan asettamiseen (ks. setvbuf alempana).

BUFSIZ

on oletuksena käytettävä puskurikoko, joka on vähintään 256 merkkiä/tavua.

EOF

on kokonaisluku, joka ei vastaa mitään kelvollista merkkiä. Se ilmaisee, ettei virrasta voida lukea enempää merkkejä (kuten jos tiedosto on luettu loppuun).

FOPEN_MAX

on kokonaisluku, joka ilmaisee, kuinka monta tiedostoa saa olla yhtä aikaa auki (mukaan lukien edellä mainitut standardivirrat); standardin mukaan vähintään kahdeksan.

FILENAME_MAX

on kokonaisluku, joka ilmaisee pisintä tiedostonimen pituutta, jonka voi varmasti antaa tiedostonimeä vaativalle funktiolle.

L_tmpnam

on kokonaisluku, joka ilmaisee, kuinka monen merkin verran tilaa pitää olla puskurissa, että sinne mahtuu varmasti tmpnam-funktion generoima satunnainen tiedostonimi.

SEEK_SET
SEEK_CUR
SEEK_END

ovat kokonaislukuja, jotka sopivat fseek-funktion kolmanneksi argumentiksi.

TMP_MAX

on kokonaisluku, joka ilmaisee, kuinka monta erilaista tiedostonimeä tmpnam voi varmasti yhteensä luoda, standardin mukaan vähintään 25.

stderr
stdin 
stdout

ovat edellä mainitut standardivirrat, jotka ovat tyyppiä FILE *. stderr on standardivirhetuloste, stdin on standardisyöte ja stdout standardituloste.

Tiedosto-operaatiot

[muokkaa | muokkaa wikitekstiä]
 int remove(const char *tiedostonimi);

Poistaa tiedostonimen nimeämän tiedoston. Palauttaa nollan, jos poisto onnistui, ja muuten jonkin muun arvon kuin nollan.

 int rename(const char *tiedostonimi, const char *uusinimi);

Nimeää tiedostonimen nimeämän tiedoston uudelle nimelle. Palauttaa nollan, jos nimen muutos onnistui, ja muuten jonkin muun arvon kuin nollan. Jos muutos epäonnistui, tiedosto on varmasti yhä saatavilla vanhalla nimellään.

Jos tiedosto uudella nimellä on jo olemassa, C-standardi ei määrää, miten rename:n tulee toimia.

 FILE *tmpfile(void);

Luo tyhjän tilapäistiedoston ja avaa sen tilassa wb+ (ks. fopen), eli sitä voi sekä lukea että kirjoittaa. Palauttaa virran (tyyppiä FILE *), tai NULL:in, jos tapahtui virhe.

Jos ohjelman suoritus päättyy normaalisti, tilapäistiedosto poistetaan automaattisesti. Jos ohjelman suoritus päättyy äkillisesti virheeseen, tiedostoa ei välttämättä poisteta.

 char *tmpnam(char *tiedostonimi);

Luo satunnaisen tiedostonimen, jonka nimistä tiedostoa ei varmasti ole olemassa. Tiedostonimi sijoitetaan annettuun puskuriin, jossa on oltava tilaa vähintään L_tmpnam merkille. Jos tiedostonimi on NULL, tiedostonimi sijoitetaan sisäiseen puskuriin, joita on koko ohjelmassa vain yksi.

Palauttaa osoittimen tiedostonimeen, joko annettuun puskuriin tai sisäiseen puskuriin.

Useissa nykyisissä käyttöjärjestelmissä tmpnam:n käyttö ei ole suotavaa, sillä niissä on jokin turvallisempi tapa luoda satunnaistiedostojen nimiä. tmpnam ei nimittäin takaa, että tiedostonimi olisi enää vapaana silloin, kun tiedostoa lähdetään luomaan eri funktiolla. Esimerkiksi uusissa Linux-versioissa linkkeri varoittaa, jos linkattu ohjelma käyttää tmpnam:ia (warning: the use of `tmpnam' is dangerous).

Pääsy tiedostoihin

[muokkaa | muokkaa wikitekstiä]
 int fclose(FILE *virta);

Sulkee tietovirran. Palauttaa nollan, jos sulkeminen tapahtui ongelmitta, ja EOF:n, jos tapahtui virhe. Vaikka tapahtuisi virhe, annettua tietovirtaa ei saa enää käyttää.

 int fflush(FILE *stream);

Tyhjentää tietovirran kirjoituspuskurit ja kirjoittaa puskuroidun datan tiedostoon heti. Palauttaa nollan, jos data kirjoitettin ongelmitta, ja EOF:n, jos tapahtui virhe.

 FILE *fopen(const char *tiedostonimi, const char *tila);

Avaa tietovirran tiedostoon. Palauttaa tietovirran (FILE *), jos tiedoston avaaminen onnistui, tai NULL:n, jos tapahtui virhe. tila on merkkijono, jonka sisältö koostuu päätilasta (yksi merkki) ja valinnaisista määreistä (yksi merkki määrettä kohden).

fopen: päätilat
Tunnus Merkitys
r Tiedostoa luetaan. Ensimmäinen luettava tietue on tiedoston alussa.
Tiedoston tulee olla jo olemassa.
w Tiedostoa kirjoitetaan. Ensimmäinen kirjoitettava tietue on tiedoston alussa.
Jos tiedosto on jo olemassa, sen sisältö poistetaan niin, että tiedosto on tyhjä.
a Tiedoston loppuun kirjoitetaan. Ensimmäinen luettava tietue on tiedoston lopussa.

Määreitä voivat olla:

fopen: määreet
Tunnus Merkitys
+ "Päivitystila": tekee virrasta sekä luku- että kirjoitusvirran. Tällöin:
  • r+ on luku- ja kirjoitusvirta, joka vaatii olemassa olevan tiedoston
  • w+ on luku- ja kirjoitusvirta, joka luo uuden tiedoston, tai tyhjentää olemassa olevan tiedoston
  • a+ on luku- ja kirjoitusvirta, jossa kaikki uusi tieto kirjoitetaan tiedoston loppuun

Jos tiedostosta luetaan, siihen saa kirjoittaa vasta onnistuneen fflush-, fseek-, fsetpos- tai rewind-kutsun jälkeen, ja päinvastoin.

b Tiedosto avataan binääritilassa eikä tekstitilassa.

Esimerkki: jos halutaan avata binääritiedosto luettavaksi, fopen:n tila tulee olla rb.

Palautetun virran lopun- ja virheenilmaisimet ovat pois päältä.

 FILE *freopen(const char *tiedostonimi, const char *tila, FILE *virta);

Tekee saman kuin fclose(virta) (paluuarvoa tarkistamatta) ja sitten fopen(tiedostonimi, tila), ja palauttaa saman asian kuin jälkimmäinen.

[C99] Poikkeus: Jos tiedostonimi on NULL, yrittää muuttaa virran tilaa fopen:n tavoin. C-standardi ei takaa, että toteutus onnistuisi tässä millään tavalla. Palauttaa silloin virran, jos tilan muutos onnistui, ja NULL:n, jos se epäonnistui.

Palautetun virran lopun- ja virheenilmaisimet ovat pois päältä.

 void setbuf(FILE *virta, char *puskuri);

Jos virta on NULL, sama kuin setvbuf(virta, NULL, _IONBF, 0), muttei palauta mitään.

Jos virta ei ole NULL, asettaa sen tiedoston puskuriksi, jonka koko on BUFSIZ: sama kuin setvbuf(virta, puskuri, _IOFBF, BUFSIZ), muttei palauta mitään.

 int setvbuf(FILE *virta, char *puskuri, int tila, size_t koko);

Vaihtaa avoimen virran puskurointia.

Jos tila on _IOFBF (täyspuskurointi) tai _IOLBF (rivipuskurointi), kirjasto tarvitsee puskurin. Jos puskuri on NULL, funktio varaa sen itse. Muussa tapauksessa annetussa puskurissa tulee olla tilaa merkeille annetun koon verran, ja puskurin tulee olla kelvollinen niin pitkään kuin tiedosto on auki.

Jos tila on _IONBF, virran puskurointi poistetaan käytöstä. Tällöin puskuri- ja kokoargumentteja ei huomioida lainkaan, mutta niiden kannattaa silti selkeyden vuoksi olla NULL ja 0.

Palauttaa nollan, jos puskurointia muutettiin onnistuneesti, ja muuten jonkin muun arvon.

Kaavamainen luku ja kirjoitus

[muokkaa | muokkaa wikitekstiä]

Näiden funktioiden kaavat ovat oma taiteenlajinsa, joille on oma sivu, ks. C/Standardikirjastot/stdio.h/printf-kaavat.

 int fprintf(FILE *virta, const char *kaava, ...);

Kirjoittaa annettuun tietovirtaan tietoa argumenttina annetun kaavan mukaisesti. Palauttaa kirjoitettujen merkkien määrän, tai negatiivisen luvun, jos tapahtui I/O-virhe.

 int fscanf(FILE *virta, const char *kaava, ...);

Lukee annetusta tietovirrasta tietoa argumenttina annetun kaavan mukaisesti. Palauttaa onnistuneesti luettujen kenttien lukumäärän, tai negatiivisen luvun, jos tapahtui I/O-virhe ennen ensimmäisenkään kentän lukemista.

 int printf(const char *kaava, ...);

Kirjoittaa standarditulosteeseen tietoa argumenttina annetun kaavan mukaisesti; sama kuin fprintf(stdout, kaava, ...). Palauttaa kirjoitettujen merkkien määrän, tai negatiivisen luvun, jos tapahtui virhe.

 int scanf(const char *kaava, ...);

Lukee standardisyötteestä tietoa argumenttina annetun kaavan mukaisesti; sama kuin fscanf(stdin, kaava, ...). Palauttaa onnistuneesti luettujen kenttien lukumäärän, tai negatiivisen luvun, jos tapahtui I/O-virhe ennen ensimmäisenkään kentän lukemista.

 int snprintf(char *puskuri, size_t koko, const char *kaava, ...);

[Lisätty C99-standardissa]

Kirjoittaa puskuriin merkkijonona tietoa argumenttina annetun kaavan mukaisesti. Palauttaa, montako merkkiä (nollamerkkiä lukuun ottamatta) funktio kirjoitti tai olisi kirjoittanut, jos puskurissa olisi riittänyt tilaa kaikille niistä, tai negatiivisen luvun, jos tapahtui virhe. Puskuriin ei kirjoiteta koskaan annettua kokoa enempää merkkejä, ja nollamerkki kirjoitetaan oikein, kunhan koko ei ole nolla.

puskuri saa olla NULL, jos koko on 0. Tällöin funktio vain palauttaa pituuden. Näin on mahdollista varata oikeankokoinen puskuri merkkijonolle (koko paluuarvo + 1 merkkiä, kunhan paluuarvo ei ole negatiivinen).

 int sprintf(char *puskuri, const char *kaava, ...);

Kirjoittaa puskuriin merkkijonona tietoa argumenttina annetun kaavan mukaisesti. Palauttaa kirjoitettujen merkkien määrän, johon ei lasketa mukaan nollamerkkiä, tai negatiivisen arvon, jos tapahtui virhe. Puskurin kokoa ei voi suoraan rajoittaa.

 int sscanf(const char *mjono, const char *kaava, ...);

Lukee merkkijonosta tietoa argumenttina annetun kaavan mukaisesti. Palauttaa onnistuneesti luettujen kenttien lukumäärän.

 int vfprintf(FILE *virta, const char *kaava, va_list argumentit);
 int vfscanf(FILE *virta, const char *kaava, va_list argumentit);
 int vprintf(const char *kaava, va_list argumentit);
 int vscanf(const char *kaava, va_list argumentit);
 /* C99 */ int vsnprintf(char *puskuri, size_t koko, const char *kaava, va_list argumentit);
 int vsprintf(char *puskuri, const char *kaava, va_list argumentit);
 int vsscanf(const char *mjono, const char *kaava, va_list argumentit);

Sama funktio kuin vastaava funktio ilman v-etuliitettä, mutta argumentit annetaan listalta (ks. stdarg.h).

Merkkien lukeminen ja kirjoittaminen

[muokkaa | muokkaa wikitekstiä]
 int fgetc(FILE *virta);

Lukee seuraavan merkin tietovirrasta ja palauttaa sen. Jos merkkiä ei voitu lukea, palauttaa EOF:n, ja kytkee virran lopun- tai virheenilmaisimen päälle riippuen tilanteesta (tiedosto luettu loppuun vai I/O-virhe).

 char *fgets(char *puskuri, int koko, FILE *virta);

Lukee virrasta rivin tekstiä ja sijoittaa sen puskuriin, jonka koko annetaan argumenttina. Tekstin lukeminen päättyy, kun on luettu rivinvaihtomerkki, kun tiedosto päättyy, tai kun puskurista loppuu tila (on luettu koko - 1 merkkiä). Lopuksi puskurin loppuun kirjoitetaan nollamerkki, jotta se on kelvollinen C-merkkijono.

Jos rivinvaihto luetaan, se sijoitetaan puskuriin. Näin ohjelma voi tarkistaa, luettiinko rivi loppuun asti (rivinvaihtomerkki rivin lopussa) vai ei.

Jos rivi luettiin onnistuneesti, palauttaa annetun osoittimen puskuriin sellaisenaan. Jos tiedosto on jo luettu loppuun, palauttaa NULL:in, kytkee virran lopunilmaisimen päälle, ja puskurin sisältöä ei muuteta. Jos tapahtuu I/O-virhe, palauttaa NULL:in, kytkee virran virheenilmaisimen päälle, ja puskurin sisältöä ei taata millään tavalla.

 int fputc(int merkki, FILE *virta);

Kirjoittaa merkin (muunnetaan unsigned char:ksi) virtaan. Jos merkki kirjoitettiin onnistuneesti, se palautetaan muunnettuna. Jos tapahtui virhe, palauttaa EOF:n, ja kytkee virran virheenilmaisimen päälle.

 int fputs(const char *mjono, FILE *virta);

Kirjoittaa C-merkkijonon (ilman nollamerkkiä) virtaan. Jos se kirjoitettiin onnistuneesti, palauttaa nollan tai positiivisen arvon. Jos tapahtui virhe, palauttaa EOF:n, ja kytkee virran virheenilmaisimen päälle.

 int getc(FILE *virta);

Sama kuin fgetc, mutta mahdollisesti toteutettu makrona, joten käytön kanssa pitää olla varovainen (jos virta saadaan funktiosta, funktiota saatetaan kutsua useamman kerran). Makrototeutuksen etuna on, että getc olla merkittävästi nopeampi, kun sitä kutsutaan todella monta kertaa.

 int getchar(void);

Sama kuin fgetc(stdin), eli lukee merkin standardisyötteestä.

 char *gets(char *puskuri);

Lukee tekstiä standardisyötteestä. Älä käytä; tämä funktio on poistettu syystäkin myöhemmistä standardeista, koska se on vaarallinen. Puskurin kokoa ei voi rajoittaa mitenkään, joten käyttäjä voi helposti kaataa ohjelman, jos se käyttää tätä. Funktio on mainittu tällä sivulla vain siksi, että siihen voi törmätä vanhassa C-koodissa.

 int putc(int merkki, FILE *virta);

Sama kuin fputc, mutta mahdollisesti toteutettu makrona, joten käytön kanssa pitää olla varovainen (jos virta saadaan funktiosta, funktiota saatetaan kutsua useamman kerran). Makrototeutuksen etuna on, että putc olla merkittävästi nopeampi, kun sitä kutsutaan todella monta kertaa.

 int putchar(int merkki);

Sama kuin fputc(merkki, stdout), eli kirjoittaa merkin standardisyötteeseen.

 int puts(const char *mjono);

Kirjoittaa C-merkkijonon (ilman nollamerkkiä) standarditulosteeseen ja sen perään vielä rivinvaihdon. Jos kirjoitus onnistui, palauttaa nollan tai positiivisen arvon. Jos tapahtui virhe, palauttaa EOF:n.

 int ungetc(int merkki, FILE *virta);

Työntää viimeksi (f)getc:llä luetun merkin takaisin virtaan. Kun virrasta yritetään lukea seuraava merkki, saadaankin tulokseksi ungetc:lle annettu merkki. Virrasta saa seuraavan merkin oikeasti vasta, kun työnnetyt merkit on luettu ensin. Tietovirtaan kytkettyä tiedostoa ei muokata, vaan työnnetty merkki jää pelkästään puskuriin.

C-standardi takaa, että ungetc onnistuu, jos sitä kutsuu korkeintaan kerran jokaisen luvun välissä. Toteutus voi toki tukea useampaakin kutsua kerralla. Jos tukee, silloin viimeksi työnnetty merkki luetaan ensimmäisenä.

Jos virtaa siirretään fseek-, fsetpos- tai rewind-kutsulla, ungetc:llä työnnetyt merkit hylätään. Tiedoston kohdistimen sijainti (ftell, fgetpos) on standardin mukaan määrittelemätön, jos työnnettyjä merkkejä on lukematta tai hylkäämättä, paitsi binääritiedostoissa, jos työnnettyjä merkkejä on enintään tiedostosta jo luettujen merkkien verran.

Palauttaa työnnetyn merkin, tai EOF:n, jos tapahtui virhe.

Puskuriin lukeminen ja puskurista kirjoittaminen

[muokkaa | muokkaa wikitekstiä]
 size_t fread(void *puskuri, size_t koko, size_t lkm, FILE *virta);

Lukee virrasta puskuriin annetun lukumäärän verran tietueita, joiden koko on annetun argumentin verran; yhteensä lukee virrasta koko * lkm merkkiä (yleensä tavua). Jos virta on tiedosto, tietoa luetaan kohdistimen kohdalta, ja kohdistinta siirretään eteenpäin niin, että seuraava kutsu lukee luettujen jälkeisiä tietueita.

Funktio palauttaa onnistuneesti luettujen tietueiden määrän, joka on korkeintaan lkm. Jos paluuarvo on vähemmän kuin lkm, tiedosto joko loppui kesken, tai tapahtui virhe. Näissä tapauksissa tiedoston kohdistimen sijaintia ei ole tarkoin määritelty.

Jos koko tai lukumäärä on nolla, funktio palauttaa nollan, eikä koske puskurin sisältöön.

 size_t fwrite(const void *puskuri, size_t koko, size_t lkm, FILE *virta);

Kirjoittaa virtaan puskurista annetun lukumäärän verran tietueita, joiden koko on annetun argumentin verran; yhteensä kirjoittaa virtaan koko * lkm merkkiä (yleensä tavua). Jos virta on tiedosto, tietoa kirjoitetaan kohdistimen kohdalle, ja kohdistinta siirretään eteenpäin niin, että seuraava kutsu kirjoittaa kirjoitettujen jälkeisiä tietueita.

Funktio palauttaa onnistuneesti kirjoitettujen tietueiden määrän, joka on korkeintaan lkm. Jos paluuarvo on vähemmän kuin lkm, tapahtui kirjoitusvirhe. Silloin tiedoston kohdistimen sijaintia ei ole tarkoin määritelty.

Jos koko tai lukumäärä on nolla, funktio palauttaa nollan, eikä virtaan kirjoiteta mitään.

Tiedoston kohdistimen sijainnin määritys

[muokkaa | muokkaa wikitekstiä]
 int fgetpos(FILE *virta, fpos_t *sijainti);

Tallettaa tiedoston kohdistimen sijainnin fpos_t-tietueeseen.

Jos tämä onnistui, palauttaa nollan. Jos tapahtui virhe, palauttaa jonkin muun arvon, ja tallettaa virheen numeron errno:on (ks. errno.h).

 int fseek(FILE *virta, long int siirros, int verrokki);

Siirtää tiedoston kohdistimen sijaintia annettuun kohtaan. Kohta määritellään siirroksena (merkkeinä, eli yleensä tavuina) verrokista.

Verrokki
Arvo Tarkoittaa
SEEK_SET Tiedoston alku
SEEK_CUR Kohdistimen nykyinen sijainti
SEEK_END Tiedoston loppu

Esimerkiksi siirros +5 ja verrokki SEEK_SET asettaa binääritiedoston kohdistimen 5 merkkiä (yleensä tavua) eteenpäin tiedoston alusta, kun taas siirros -5 ja verrokki SEEK_END asettaa binääritiedoston kohdistimen 5 merkkiä (yleensä tavua) taaksepäin tiedoston lopusta.

C-standardi asettaa lisärajoituksia käytölle, joita mm. POSIX-standardi ei aseta:

  • Tekstitiedostoilla siirroksen on oltava nolla tai arvo, joka on aiemmin saatu funktiolta ftell. Jälkimmäisessä tapauksessa verrokin tulee olla SEEK_SET.
  • Binääritiedostoilla SEEK_END-verrokin käyttöä ei välttämättä tueta.

Jos tämä onnistui, palauttaa nollan, kytkee virran lopunilmaisimen pois päältä, ja hylkää ungetc:llä työnnetyt merkit. Jos tapahtui virhe, palauttaa jonkin muun arvon.

 int fsetpos(FILE *virta, const fpos_t *sijainti);

Siirtää tiedoston kohdistimen sijainnin takaisin aiemmin talletettuun kohtaan.

Jos tämä onnistui, palauttaa nollan, kytkee virran lopunilmaisimen pois päältä, ja hylkää ungetc:llä työnnetyt merkit. Jos tapahtui virhe, palauttaa jonkin muun arvon, ja tallettaa virheen numeron errno:on (ks. errno.h).

 long int ftell(FILE *virta);

Palauttaa tiedoston kohdistimen sijainnin. Jos kohdistimen sijaintia ei voida palauttaa, palauttaa -1L, ja tallettaa virheen numeron errno:on (ks. errno.h).

 void rewind(FILE *virta);

Sama kuin fseek(virta, 0, SEEK_SET); siirtää tiedoston kohdistimen takaisin tiedoston alkuun, ja kytkee virran lopunilmaisimen pois päältä.

Muut funktiot

[muokkaa | muokkaa wikitekstiä]
 void clearerr(FILE *virta);

Kytkee virran lopun- ja virheenilmaisimet pois päältä.

 int feof(FILE *virta);

Palauttaa jonkin muun arvon kuin nollan, jos virran lopunilmaisin on päällä, ja nollan, jos se on pois päältä.

 int ferror(FILE *virta);

Palauttaa jonkin muun arvon kuin nollan, jos virran virheenilmaisin on päällä, ja nollan, jos se on pois päältä.

 void perror(const char *etuliite);

Tulostaa errno:n (ks. errno.h) arvon mukaisen tekstin standardivirhetulosteeseen.

Jos etuliite on NULL tai osoittaa tyhjään merkkijonoon, kirjoittaa pelkän virheviestin ja sen perään rivinvaihdon.

Jos etuliite osoittaa merkkijonoon, jossa on ainakin yksi merkki, kirjoittaa etuliitteen, sitten kaksoispisteen, välilyönnin, virheviestin ja rivinvaihdon (esim. etuliitteellä tiedoston avausvirhe tuloste voisi olla tiedoston avausvirhe: ei tällaista tiedostoa tai hakemistoa).