fprintf în C

Scrie text formatat într-un fișier sau în stderr, cu același șablon ca printf.

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

Ce face fprintf

fprintf este printf cu un parametru în plus: fișierul în care scrie. printf(...) este de fapt fprintf(stdout, ...). Specificatorii (%d, %s, %.2f) sunt aceiași.

Fiecare program are trei fluxuri deschise automat: stdin (intrarea), stdout (ieșirea normală) și stderr (mesajele de eroare). Mesajele de eroare se scriu cu fprintf(stderr, ...), ca să nu se amestece cu datele, de exemplu când ieșirea programului este redirecționată într-un fișier cu >.

Parametri

Parametru Descriere
stream Unde se scrie: un fișier deschis cu fopen, stdout sau stderr.
format, ... Șablonul și valorile, ca la printf.

Ce returnează

Numărul de caractere scrise sau o valoare negativă la eroare.

Exemple

Exemplul 1: Un fișier CSV cu vânzări

Programul scrie un antet și câte un rând pentru fiecare oraș, apoi citește fișierul înapoi ca să vedem ce conține.

#include <stdio.h>

int main(void) {
    const char *orase[] = {"Iași", "Cluj", "Brașov"};
    double vanzari[] = {1520.5, 980.0, 1210.75};

    FILE *f = fopen("vanzari.csv", "w");
    if (f == NULL) {
        perror("vanzari.csv");
        return 0;
    }
    fprintf(f, "oras,vanzari\n");
    for (int i = 0; i < 3; i++) {
        fprintf(f, "%s,%.2f\n", orase[i], vanzari[i]);
    }
    fclose(f);

    f = fopen("vanzari.csv", "r");
    if (f == NULL) return 0;
    char rand[64];
    while (fgets(rand, sizeof rand, f) != NULL) {
        fputs(rand, stdout);
    }
    fclose(f);
    return 0;
}

Rezultat

oras,vanzari
Iași,1520.50
Cluj,980.00
Brașov,1210.75

Exemplul 2: Mesaje de eroare pe stderr

Datele merg pe stdout, avertismentul pe stderr. În terminal apar amândouă; dacă rulezi ./program > rezultat.txt, în fișier ajung doar datele. Aici, ieșirea de eroare a fost afișată după cea normală.

#include <stdio.h>

int main(void) {
    int note[] = {9, 11, 8};
    for (int i = 0; i < 3; i++) {
        if (note[i] < 1 || note[i] > 10) {
            fprintf(stderr, "Atenție: nota %d de pe poziția %d nu este validă\n", note[i], i);
            continue;
        }
        fprintf(stdout, "Nota %d: %d\n", i, note[i]);
    }
    return 0;
}

Rezultat

Nota 0: 9
Nota 2: 8
Atenție: nota 11 de pe poziția 1 nu este validă

Greșeli frecvente

  • Inversezi ordinea argumentelor: fprintf("%d", f, x). Fișierul este primul argument.
  • Scrii erorile cu printf. Când ieșirea este redirecționată sau trimisă altui program, mesajele de eroare ajung amestecate cu datele.
  • Folosești fprintf pe un fișier deschis cu "r". Scrierea eșuează; deschide cu "w", "a" sau un mod cu +.

Comenzi înrudite

  • printf: Afișează text formatat pe ecran: un șablon cu specificatori (%d, %s, %.2f) completați cu valorile primite după el.
  • 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.
  • fscanf: Citește valori dintr-un fișier după un șablon, ca scanf; returnează câte câmpuri a citit sau EOF la final.
  • errno, perror și strerror: errno păstrează codul ultimei erori a unei funcții de bibliotecă; perror și strerror îl transformă într-un mesaj citibil.
  • Specificatori de format (%d, %f, %s): Ce înseamnă %d, %u, %f, %e, %s, %c, %x, %zu și cum controlezi lățimea, zecimalele și alinierea în printf.