C-keele fopen
kasutamine ja praktilised näited
1. Mis on fopen
?
fopen
on C-keele standardne raamatukogu funktsioon, mida kasutatakse failide töötlemiseks. Seda kasutatakse failide lugemiseks ja kirjutamiseks ning see toimib sillana programmi ja faili vahel. Faili avamiseks kasutatakse fopen
funktsiooni ja sellele järgneb lugemis- või kirjutamistoiming.
1.1 fopen
süntaks ja parameetrid
fopen
põhisüntaks on järgmine:
FILE *fopen(const char *filename, const char *mode);
filename
: Faili nimi (või tee), mida soovitakse avada.mode
: Režiim, milles fail avatakse.
1.2 fopen
režiimid
Faili avamise režiime on mitu, sõltuvalt kasutuseesmärgist.
"r"
: Avab faili lugemiseks (kui faili ei eksisteeri, siis avamine ebaõnnestub)."w"
: Avab faili kirjutamiseks (kui fail eksisteerib, siis selle sisu kustutatakse ja fail luuakse uuesti)."a"
: Avab faili lisamiseks (kui faili ei eksisteeri, siis see luuakse)."rb"
,"wb"
,"ab"
: Avab faili binaarrežiimis lugemiseks, kirjutamiseks või lisamiseks.
Lisaks on olemas režiimid nagu r+
, w+
, a+
, mis võimaldavad nii lugemist kui kirjutamist. Iga režiim sobib erinevaks otstarbeks, seega on oluline valida sobiv režiim vastavalt vajadusele.

2. fopen
põhikasutus
2.1 Faili avamine
Siin on näide, kuidas kasutada fopen
funktsiooni faili avamiseks.
#include <stdio.h>
int main(void) {
FILE *fp;
// Ava fail "test.txt" lugemisrežiimis
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("Faili ei saanud avada.\n");
return -1;
}
// Kui fail avati edukalt
fclose(fp);
return 0;
}
2.2 Vigade käsitlemine
fopen
tagastab NULL
, kui faili avamine ebaõnnestub. See võib juhtuda näiteks siis, kui faili pole olemas või puuduvad vajalikud õigused. Seetõttu on oluline alati kontrollida, kas fail avati edukalt.
if (fp == NULL) {
perror("Faili avamise viga");
return -1;
}
2.3 Faili sulgemine
Pärast faili avamist tuleb see kindlasti sulgeda fclose
funktsiooniga. Kui faili ei suleta, võib tekkida probleeme nagu mäluleke või faili käepidemete (handle) puudus.
fclose(fp);

3. Faili lugemine ja kirjutamine
3.1 Faili lugemine
Pärast faili avamist on selle sisu lugemiseks mitu võimalust. Allpool on näide, kus kasutatakse fgets
funktsiooni, et lugeda faili rida rea haaval.
#include <stdio.h>
int main(void) {
FILE *fp;
char buffer[256];
// Ava fail "test.txt" lugemiseks
fp = fopen("test.txt", "r");
if (fp == NULL) {
printf("Faili ei saanud avada.\n");
return -1;
}
// Loe failist ridu seni, kuni kõik read on loetud
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
return 0;
}
3.2 Faili kirjutamine
Faili kirjutamiseks tuleb see avada fopen
abil ning seejärel saab kasutada fprintf
või fputs
funktsioone andmete kirjutamiseks.
#include <stdio.h>
int main(void) {
FILE *fp;
// Ava "test.txt" kirjutamiseks ja loo fail, kui see ei eksisteeri
fp = fopen("test.txt", "w");
if (fp == NULL) {
printf("Faili ei saanud avada.\n");
return -1;
}
// Kirjuta tekst faili
fprintf(fp, "Hello, World!\n");
fclose(fp);
return 0;
}
3.3 Faili täiendamine
Olemasolevale failile andmete lisamiseks kasutatakse fopen
režiimi "a"
(append).
fp = fopen("test.txt", "a");
See režiim avab faili nii, et olemasolev sisu säilitatakse ja uued andmed lisatakse lõppu.

4. fopen
edasijõudnud kasutusviisid
4.1 Binaarfailide töötlemine
Binaarfailide lugemiseks ja kirjutamiseks kasutatakse režiime "rb"
ja "wb"
. Allpool on näide, kuidas salvestada struktureeritud andmeid (nt struktuuride massiivi) binaarfaili.
#include <stdio.h>
typedef struct {
int id;
char name[50];
} Record;
int main(void) {
FILE *fp;
Record record = {1, "Sample"};
// Ava binaarfail kirjutamiseks (fail luuakse, kui see ei eksisteeri)
fp = fopen("data.bin", "wb");
if (fp == NULL) {
printf("Faili ei saanud avada.\n");
return -1;
}
// Kirjuta struktuur binaarfaili
fwrite(&record, sizeof(Record), 1, fp);
fclose(fp);
return 0;
}
4.2 Turvaline failitöötlus fopen_s
abil
fopen_s
on turvalisem versioon fopen
funktsioonist, mis lisati turvakaalutlustel. Kui faili avamine ebaõnnestub, tagastab see veakoodi, mis võimaldab paremat veatöötlust.
errno_t err;
err = fopen_s(&fp, "test.txt", "r");
if (err != 0) {
printf("Faili ei saanud avada.\n");
return err;
}
fopen_s
kasutamine aitab parandada programmi turvalisust ja usaldusväärsust failidega töötamisel.

5. Levinumad probleemid ja parimad tavad
5.1 Vigade kontrollimine
Failidega töötamisel on vigade kontroll äärmiselt oluline. Tuleb kontrollida fopen
tagastusväärtust ja näiteks fgets
tulemusi. Kui tekib viga, tuleb see korrektselt käsitleda.
5.2 Mäluhaldus
Kui töötad failidega, siis sulge need alati kasutades fclose
. Faili lahti jätmine võib põhjustada süsteemiressursside ammendumise või andmete rikutuse.
5.3 Turvalisuse kaalutlused
fopen
kasutamisel tuleb arvestada turvalisust, näiteks kontrollida failitee õigsust ja failile ligipääsu õigusi. fopen_s
kasutamine aitab teostada failitööd turvalisemalt.
6. Kokkuvõte
fopen
on C-keeles failidega töötamise põhiline funktsioon. Selle korrektne kasutamine koos vigade kontrolli ja turvakaalutlustega võimaldab failidega töötada turvaliselt ja tõhusalt.