Ce face fscanf
fscanf este scanf pentru un fișier oarecare: scanf(...) înseamnă fscanf(stdin, ...). Citește textul, îl convertește după specificatori și scrie valorile la adresele primite.
Bucla obișnuită pentru un fișier cu date pe coloane este while (fscanf(f, "%31s %d", nume, ¬a) == 2): se oprește la sfârșitul fișierului (când returnează EOF) și la primul rând care nu se potrivește cu șablonul.
fscanf nu ține cont de rânduri: %d și %s sar peste orice spațiu alb, inclusiv '\n'. Pentru fișiere în care un rând poate fi greșit, citește rândul cu fgets și analizează-l cu sscanf, ca să poți raporta exact rândul cu problemă.
Parametri
| Parametru | Descriere |
|---|---|
stream |
Fișierul deschis pentru citire. |
format, ... |
Șablonul și adresele variabilelor, ca la scanf. |
Ce returnează
Numărul de câmpuri citite și salvate, sau EOF dacă fișierul s-a terminat înainte de prima conversie.
Exemple
Exemplul 1: Media notelor dintr-un fișier
Întâi creăm fișierul cu fprintf. Apoi fscanf citește perechi nume–notă cât timp returnează 2.
#include <stdio.h>
int main(void) {
FILE *f = fopen("catalog.txt", "w");
if (f == NULL) return 0;
fprintf(f, "Ana 9\nMihai 7\nElena 10\nRadu 8\n");
fclose(f);
f = fopen("catalog.txt", "r");
if (f == NULL) return 0;
char nume[32];
int nota, numar = 0, suma = 0;
while (fscanf(f, "%31s %d", nume, ¬a) == 2) {
printf("%-6s %2d\n", nume, nota);
suma += nota;
numar++;
}
fclose(f);
printf("Media clasei: %.2f\n", (double)suma / numar);
return 0;
}
Rezultat
Ana 9
Mihai 7
Elena 10
Radu 8
Media clasei: 8.50
Exemplul 2: Oprirea la un rând greșit
Pe al doilea rând nota este scrisă cu litere. fscanf citește numele, dar nu poate converti noua și returnează 1, așa că bucla se oprește. Valoarea returnată spune ce s-a întâmplat.
#include <stdio.h>
int main(void) {
FILE *f = fopen("date.txt", "w");
if (f == NULL) return 0;
fprintf(f, "Ana 9\nIoana noua\nDan 6\n");
fclose(f);
f = fopen("date.txt", "r");
if (f == NULL) return 0;
char nume[32];
int nota, r;
while ((r = fscanf(f, "%31s %d", nume, ¬a)) == 2) {
printf("ok: %s %d\n", nume, nota);
}
printf("fscanf a returnat %d", r);
printf(r == EOF ? " (sfârșit de fișier)\n" : " (date care nu se potrivesc)\n");
fclose(f);
return 0;
}
Rezultat
ok: Ana 9
fscanf a returnat 1 (date care nu se potrivesc)
Greșeli frecvente
- Scrii bucla ca
while (!feof(f)).feofdevine adevărat abia după o citire eșuată, așa că ultimul rând este procesat de două ori. Testează valoarea returnată defscanf. - Folosești
%sfără lățime: un cuvânt mai lung decât tabloul scrie peste alte date. Pune%31spentruchar nume[32]. - Te aștepți ca
%ssă citească un nume cu spații („Ana Maria”).%sse oprește la primul spațiu; folosește un separator (virgulă) și%[^,], saufgets.
Comenzi înrudite
scanf: Citește valori de la tastatură după un șablon (%d, %lf, %s) și le scrie la adresele primite; returnează câte valori a citit.fopen și fclose: Deschide un fișier pentru citire, scriere sau adăugare și returnează un FILE *; fclose îl închide și salvează datele rămase.fprintf: Scrie text formatat într-un fișier sau în stderr, cu același șablon ca printf.fgets: Citește un rând întreg (cu tot cu spații) într-un tablou de caractere, fără să depășească dimensiunea dată.snprintf și sprintf: Formatează text ca printf, dar îl scrie într-un tablou de caractere; snprintf nu depășește niciodată dimensiunea dată.
Întrebări & Exemple de Cod:
fscanfAi o nelămurire despre utilizarea comenzii
fscanfsau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.