EOF

Linux.fista

EOF eli loppumerkki on C-ohjelmoinnissa ja yleisesti Unix-järjestelmissä tiedoston lopusta kertova erikoismerkki. Kun ohjelma lukee tiedostosta loppumerkin EOF, se tarkoittaa yleensä, että tiedoston loppu on saavutettu, eikä lisää tietoa ole enää saatavilla.

C-ohjelmoinnissa[muokkaa]

C-ohjelman kannalta tiedostot näkyvät tiedostokuvaimina (engl. file descriptor). Tiedostokuvaimesta, joka yleensä on liitetty tiedostoon, mutta voi olla liitetty myös johonkin standardivirtaan tai putkeen, voi lukea tavuja standardikirjaston kutsulla fgetc(). Kutsu palauttaa normaalisti tiedoston seuraavan 8-bittisen merkin, mutta mikäli tiedosto on lopussa tai lukemisessa tapahtuu virhe, kutsu palauttaa erikoisarvon EOF. EOF ei ole positiivinen 8-bittinen kokonaisluku (s.o. luku väliltä 0-255), vaan negatiivinen int -arvo. Näin mikään tiedosto ei voi sisältää merkkiä EOF, eikä sitä voi tallettaa tyyppiin unsigned char. Siksi paluuarvo EOF on aina erikoistapaus.

C-ohjelman tulee aina erikseen varmistaa, merkitseekö EOF -paluuarvo todella tiedoston loppua vaiko virhetilannetta kutsulla feof() tai ferror().

ASCII-loppumerkki 0x04[muokkaa]

Loppumerkkiä läheisesti muistuttaa ASCII-merkki 0x04 (End of Transmission). Vanhoissa järjestelmissä kuten CP/M järjestelmä talletti jokaisen tiedoston osalta vain sille varattujen talletuslohkojen määrän. Mikäli tiedostoon tallennettu data loppui talletuslohkojen välissä, tiedoston lopusta kertoi erikoismerkki 0x04. Tälläinen tiedosto ei voi tietenkään sisältää muuaalla kontrollimerkkiä 0x04, joka aiheuttaisi vakavia ongelmia nykyisissä järjestelmissä, joiden levyille saatetaan tallettaa mm. salattua tai pakattua binääritietoa. Siksi termillä EOF viitataan nykyisin Linux- ja Unix järjestelmissä useimmiten negatiiviseen lukufunktion paluuarvoon EOF, joka ei voi vastata arvoltaan mitään aitoa merkkiä, esimerkiksi ASCII-kontrollimerkkiä.

Terminaalissa[muokkaa]

Syötteen voi terminaalissa lopettaa antamalla erikoismerkin ^D, joka PC-järjestelmissä tapahtuu painamalla Ctrl ja D kirjaimia samaan aikaan. Tämä johtaa terminaaliajurin vaikutuksesta siihen, että terminaalia lukeva prosessi saa järjestelmältä paluuarvon EOF, ja ymmärtää syötettävän tiedon loppuneen.

Esimerkiksi komento

cat > teksti.txt

lukee terminaalista käyttäjän syötettä, kunnes annetaan erikoismerkki ^D. Tämän jälkeen cat ymmärtää tiedoston loppuneen, ja käyttäjän syöttämä teksti kirjoitetaan tiedostoon teksti.txt.