File I/O
Programele trebuie să citească și să scrie în fișiere: configurări, jurnale de tură, date salvate. C ne oferă fopen, fclose, fprintf, fscanf și fgets pentru asta
#include <stdio.h>
int main(void) {
FILE *f = fopen("salut.txt", "w");
if (f == NULL) {
printf("Nu s-a putut deschide fisierul\n");
return 1;
}
fprintf(f, "Salut de la terminal\n");
fprintf(f, "Aceasta este linia 2\n");
fclose(f);
printf("Fisier scris!\n");
return 0;
}
fopen deschide un fișier și returnează un pointer FILE. Al doilea argument este modul:
- "w": scriere (creează fișierul sau îl suprascrie dacă există)
- "r": citire (fișierul trebuie să existe)
- "a": adăugare (adaugă la sfârșit, nu șterge)
fprintf funcționează exact ca printf, dar scrie într-un fișier în loc de pe ecran. fclose închide fișierul. Fă mereu asta, altfel datele s-ar putea să nu fie salvate
Citirea dintr-un fișier
#include <stdio.h>
int main(void) {
FILE *f = fopen("salut.txt", "r");
if (f == NULL) {
printf("Fisier inexistent\n");
return 1;
}
char linie[100];
while (fgets(linie, 100, f) != NULL) {
printf("%s", linie);
}
fclose(f);
return 0;
}
fgets(linie, 100, f) citește o linie (până la 99 de caractere + '\0') din fișier în array-ul linie. Returnează NULL când nu mai sunt linii. Bucla while citește întregul fișier, linie cu linie
Putem folosi și fscanf pentru date structurate
#include <stdio.h>
int main(void) {
FILE *f = fopen("jurnal.txt", "r");
char nume[50];
int cod;
while (fscanf(f, "%s %d", nume, &cod) == 2) {
printf("%s a raportat codul %d\n", nume, cod);
}
fclose(f);
return 0;
}
fscanf returnează numărul de elemente pe care le-a citit cu succes. Când așteptăm 2 elemente (nume și cod), verificăm == 2
Tiparul pentru operații sigure pe fișiere este mereu același:
- fopen: deschide fișierul
- Verifică pentru NULL: tratează eroarea
- Citește sau scrie: fă-ți treaba
- fclose: închide fișierul
A uita de fclose este ca și cum ai lăsa robinetul deschis. Programul ar putea funcționa o vreme, dar în cele din urmă vei rămâne fără descriptori de fișiere (o resursă limitată a sistemului de operare)
Misiune: Registrul de tură al centrului de calcul
Centrul de calcul ține un registru al fiecărei ture: numele tehnicianului de serviciu și numărul de incidente pe care le-a rezolvat. La finalul turei, registrul trebuie scris pe disc, apoi citit înapoi pentru raportul de dimineață.
- Deschide un fișier "tura.txt" pentru scriere
- Scrie aceste 3 linii cu fprintf:
Enescu 95,Vlad 82,Dobre 98(nume și număr de incidente, separate prin spațiu) - Închide fișierul
- Deschide "tura.txt" pentru citire
- Citește fiecare nume și număr folosind fscanf și afișează-le ca: "Tehnician: Enescu, Incidente: 95"
- Închide fișierul
Exemplu
Programul tău ar trebui să afișeze
Tehnician: Enescu, Incidente: 95
Tehnician: Vlad, Incidente: 82
Tehnician: Dobre, Incidente: 98