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 salvestataksesize
: Ühe loetava andmeüksuse suurus (baitides)nmemb
: Loetavate üksuste arvstream
: 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.