C-keele fread() funktsiooni täielik juhend: binaarsete andmete lugemine

1. fread() ülevaade

fread() on C keeles kasutatav funktsioon, mis võimaldab lugeda binaarandmeid voost programmi. Seda funktsiooni kasutatakse faili sisu tõhusaks lugemiseks puhverisse. Eriti sobib see suurte andmemahtude, piltide või helifailide jms binaarfailide töötlemiseks.

1.1. fread() põhikasutus

fread() põhistruktuur on järgmine:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  • ptr: Puhveri viit, kuhu andmed salvestatakse
  • size: Ühe loetava andmeüksuse suurus (baitides)
  • nmemb: Loetavate üksuste arv
  • stream: Loetava voo viit

2. fread() tööpõhimõte ja tagastusväärtus

2.1. fread() tööpõhimõte

fread() loeb määratud voost määratud baitide arvu ja salvestab need ptr viidatud puhvris. Funktsioon proovib lugeda nmemb andmeüksust, mille kogusuurus on size * nmemb baiti.

2.2. fread() tagastusväärtus

fread() tagastab tegelikult loetud üksuste arvu. Tavaliselt peaks see olema võrdne nmemb väärtusega, kuid kui jõutakse faili lõpuni (EOF) või tekib viga, tagastatakse väiksem väärtus.

3. fread() kasutusnäide

3.1. Lihtne koodinäide

Järgmine koodinäide näitab, kuidas fread() abil lugeda andmeid binaarfailist.

#include <stdio.h>

int main() {
    FILE *file;
    char buffer[10];

    file = fopen("example.bin", "rb");
    if (file == NULL) {
        printf("Faili ei saa avada.\n");
        return 1;
    }

    size_t bytesRead = fread(buffer, sizeof(char), 10, file);
    printf("%zu baiti loetud.\n", bytesRead);

    fclose(file);
    return 0;
}

Selles näites avatakse binaarfail nimega “example.bin” ja loetakse sellest 10 baiti. Kui fread() õnnestub, kuvatakse loetud baitide arv.

4. fread() kasutamisel tähelepanu nõudvad kohad

4.1. Puhvri suuruse kontroll

Kui kasutate fread()-i, veenduge, et puhvri suurus oleks piisav. Ebaõige suuruse määramisel võib tekkida puhvri ületäitumine (buffer overflow), mis põhjustab ettearvamatut käitumist.

4.2. EOF ja veakontroll

fread() tagastab nmemb-st väiksema väärtuse, kui jõuab faili lõpuni (EOF) või tekib viga. Seetõttu on oluline alati kontrollida tagastusväärtust, et teha kindlaks, kas lugemine õnnestus või tekkis viga.

5. Võrdlus sarnaste funktsioonidega

5.1. Erinevused fread() ja fgets() vahel

fread() on mõeldud binaarandmete lugemiseks, samas kui fgets() loeb tekstifaile kuni reavahetusmärgini. fgets() sobib tekstifailide töötlemiseks.

5.2. Erinevused fread() ja fscanf() vahel

fscanf() loeb andmeid kindla formaadi alusel, samas kui fread() loeb binaarandmeid otse ilma kindla formaadita.

6. fread() edasijõudnud kasutusviisid

6.1. Struktuuride lugemine

fread() võimaldab lugeda otse ka keerukaid andmetüüpe, nagu struktuurid. Näiteks saab faili salvestatud struktuuri hiljem samal viisil lugeda.

typedef struct {
    int id;
    char name[20];
} Record;

Record record;
fread(&record, sizeof(Record), 1, file);

6.2. Jõudluse kaalutlused

fread() on mõeldud suure andmemahu tõhusaks lugemiseks ning on kiirem kui funktsioonid, mis loevad andmeid ükshaaval, nagu fgetc(). Suurte failide puhul on soovitatav kasutada plokipõhist lugemist jõudluse parandamiseks.

7. Kokkuvõte

fread() on võimas funktsioon binaarandmete lugemiseks C keeles. Õige kasutamise korral võimaldab see tõhusalt ja turvaliselt lugeda failide sisu programmi. Selle funktsiooni valdamine aitab paremini toime tulla binaarfailide töötlemisel C-programmeerimises.

年収訴求