C keele EOF (End of File) täielik juhend: kasutus, näited ja tüüpilised vead

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.