std::fopen în C++

Deschide un fișier în stil C (fopen) și îl închide (fclose); lucrezi cu el prin FILE*.

Sintaxă
#include <cstdio>
std::FILE* fopen(const char* nume, const char* mod);
int fclose(std::FILE* fisier);

Ce face std::fopen

fopen deschide un fișier și returnează un pointer FILE*, sau nullptr dacă nu reușește. Modul este un text: "r" citire, "w" scriere (golește fișierul), "a" adăugare la final; cu "b" la final ("rb", "wb") pentru fișiere binare.

Cu pointerul obținut folosești fprintf, fputs, fgets, fscanf, fread, fwrite. La final, fclose scrie pe disc ce era în buffer și eliberează fișierul.

Spre deosebire de std::ifstream, fișierul nu se închide singur: dacă uiți fclose, datele pot rămâne nescrise. În C++ sunt preferate fluxurile din <fstream>, dar funcțiile C apar des în cod existent și în biblioteci.

Parametri

Parametru Descriere
nume Calea fișierului.
mod "r", "w", "a", "r+", "w+", eventual cu "b".
fisier Pentru fclose: pointerul primit de la fopen.

Ce returnează

fopen: FILE* sau nullptr. fclose: 0 la succes, EOF la eroare.

Exemple

Exemplul 1: Scriere și citire cu funcții C

#include <cstdio>

int main() {
    std::FILE* f = std::fopen("produse.txt", "w");
    if (!f) {
        std::puts("Nu pot crea fișierul");
        return 0;
    }
    std::fprintf(f, "%s %.2f\n", "pâine", 4.5);
    std::fprintf(f, "%s %.2f\n", "lapte", 7.99);
    std::fclose(f);

    f = std::fopen("produse.txt", "r");
    char rand[100];
    while (std::fgets(rand, sizeof(rand), f)) {
        std::printf("> %s", rand);
    }
    std::fclose(f);
}

Rezultat

> pâine 4.50
> lapte 7.99

Exemplul 2: Fișier inexistent

#include <cstdio>

int main() {
    std::FILE* f = std::fopen("lipsa.txt", "r");
    if (f == nullptr) {
        std::puts("Fișierul nu există sau nu poate fi citit.");
    } else {
        std::fclose(f);
    }
}

Rezultat

Fișierul nu există sau nu poate fi citit.

Greșeli frecvente

  • Nu verifici dacă fopen a returnat nullptr și apelezi apoi fprintf sau fgets pe el: programul se oprește brusc.
  • Uiți fclose: fișierul rămâne deschis, iar o parte din date poate să nu ajungă pe disc.
  • Deschizi cu "w" un fișier pe care voiai să-l completezi: conținutul vechi se pierde. Pentru adăugare se folosește "a".

Comenzi înrudite

  • std::ifstream: Deschide un fișier pentru citire și îl citește la fel ca pe std::cin.
  • std::ofstream: Creează sau deschide un fișier pentru scriere și scrie în el la fel ca în std::cout.
  • std::printf: Afișează text formatat în stil C, cu marcaje precum %d, %s, %.2f.
  • std::scanf: Citește valori formatate de la tastatură în stil C, primind adresele variabilelor.