1. Sissejuhatus
C-keeles programmeerimisel on failitöötlus ja standardse sisendi haldamine väga oluline. Nende hulgas kasutatakse EOF-i (End of File) spetsiaalse väärtusena, mis tähistab faili või sisendi lõppu. Kui EOF-ist õigesti aru ei saada, võib faili lõppu valesti töödelda ning tekkida ootamatuid käitumisi. Selles artiklis selgitatakse üksikasjalikult EOF-i definitsiooni, kasutusviise ja sellega seotud tähelepanuvajadusi.
2. EOF-i määratlus ja roll
EOF (End of File) on C-keeles eriväärtus, mida kasutatakse faili lõpu või vea märkimiseks ning mis on defineeritud standardraamatukogus stdio.h
. Täpsemalt öeldes on EOF-i väärtus -1
. Failide või sisendi töötlemisel saab EOF-i abil kontrollida, kas kõik andmed on loetud.
Näiteks funktsioonid getchar()
ja fgetc()
tagastavad faili lõppu jõudes EOF-i. Nii saab programm tuvastada andmete lõppu ja teostada sobivaid toiminguid.
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
int c;
while ((c = fgetc(file)) != EOF) {
putchar(c);
}
fclose(file);
return 0;
}
See kood loeb faili sisu tähemärgi haaval ja kuvab seda kuni EOF-ini jõudmiseni.
3. EOF-i kasutusnäide: getchar() ja feof()
EOF-i kasutatakse eriti koos sisendifunktsioonidega nagu getchar()
ja fgetc()
. Allpool on toodud tüüpiline näide EOF-i kasutamisest koos getchar()
-ga.
#include <stdio.h>
int main() {
int c;
// Loeb tähemärgi standardsisendist, kuni tagastatakse EOF
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
See programm loeb standardse sisendi kaudu tähemärgi haaval ja kuvab seda kuni EOF-i sisestamiseni. Klaviatuurilt sisestatakse EOF tavaliselt Ctrl + D
(Linux või macOS) või Ctrl + Z
(Windows) abil.
Samuti on olemas funktsioon feof()
, millega saab kontrollida, kas on jõutud faili lõppu. See funktsioon tagastab tõese (1) või väärväärtuse (0).
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
if (file == NULL) {
perror("Faili ei saa avada");
return 1;
}
int c;
while ((c = fgetc(file)) != EOF) {
putchar(c);
}
if (feof(file)) {
printf("nJõuti faili lõppu.n");
}
fclose(file);
return 0;
}
Selles koodis kontrollitakse pärast EOF-ini jõudmist funktsiooniga feof()
, kas fail loeti täielikult läbi.
4. EOF-iga seotud tähelepanekud
EOF-i kasutamisel tuleb tähelepanu pöörata erinevusele char
-tüübi ja int
-tüübi vahel. Kuna getchar()
ja fgetc()
tagastavad EOF-i kui -1
, on nende tagastustüüp int
. Kui tagastatud väärtus salvestatakse char
-tüüpi muutujasse, võib tekkida märgivea tõttu viga ning EOF-i ei pruugita õigesti tuvastada.
Kui EOF salvestatakse char
-tüüpi, võib see muutuda väärtuseks 0xFF
. Selle tõttu ei pruugi faili lõppu õigesti tuvastada ja see võib põhjustada ootamatut käitumist.
Seetõttu soovitatakse EOF-i puhul kasutada int
-tüüpi. Allpool on näide EOF-i õigest tuvastamisest int
-tüübiga.
#include <stdio.h>
int main() {
int c;
while ((c = getchar()) != EOF) {
putchar(c);
}
return 0;
}
Selles koodis võetakse tagastusväärtus vastu int
-tüübina, tagades õige EOF-i tuvastamise.

5. EOF-i praktiline näide
EOF-i rakenduseks võib olla programm, mis loendab faili ridu. See programm loeb faili tähemärgi haaval kuni EOF-ini ja suurendab loendurit iga uue rea puhul.
#include <stdio.h>
int main() {
FILE *file = fopen("sample.txt", "r");
int c;
int line_count = 0;
if (file == NULL) {
perror("Faili ei saa avada");
return 1;
}
while ((c = fgetc(file)) != EOF) {
if (c == 'n') {
line_count++;
}
}
printf("Ridade arv: %dn", line_count);
fclose(file);
return 0;
}
See programm loendab failis olevad reavahetused ning kuvab lõpus ridade koguarvu. EOF-i kasutatakse faili lõpu tuvastamiseks – see on tüüpiline praktiline kasutusnäide.
6. Kokkuvõte
EOF on C-keeles oluline tööriist faili või standardse sisendi lõpu tuvastamiseks. Õige kasutamine võimaldab failide ja sisendi töötlusprogramme usaldusväärselt teostada. Samuti tasub meeles pidada, et EOF-i täpseks tuvastamiseks tuleb kasutada int
-tüüpi, mitte char
-tüüpi.
Selles artiklis käsitlesime EOF-i põhimõtteid, kasutusnäiteid ja praktilisi rakendusi. C-keeles failide haldamisel on see kindlasti väärtuslik teadmine.