fscanf în C

Citește valori dintr-un fișier după un șablon, ca scanf; returnează câte câmpuri a citit sau EOF la final.

Sintaxă
#include <stdio.h>
int fscanf(FILE *stream, const char *format, ...);

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, &nota) == 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, &nota) == 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, &nota)) == 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)). feof devine adevărat abia după o citire eșuată, așa că ultimul rând este procesat de două ori. Testează valoarea returnată de fscanf.
  • Folosești %s fără lățime: un cuvânt mai lung decât tabloul scrie peste alte date. Pune %31s pentru char nume[32].
  • Te aștepți ca %s să citească un nume cu spații („Ana Maria”). %s se oprește la primul spațiu; folosește un separator (virgulă) și %[^,], sau fgets.

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ă.
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: fscanf

Ai o nelămurire despre utilizarea comenzii fscanf sau 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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.