std::fstream în C++

Flux de fișier care poate și citi, și scrie în același fișier.

Sintaxă
#include <fstream>
std::fstream fisier("nume.txt", std::ios::in | std::ios::out);

Ce face std::fstream

std::fstream combină ifstream și ofstream. Modul de deschidere se dă explicit: std::ios::in (citire), std::ios::out (scriere), std::ios::app (adăugare), std::ios::trunc (golire), std::ios::binary.

Cu in | out, fișierul trebuie să existe deja; altfel deschiderea eșuează. Cu in | out | trunc este creat sau golit. Între scriere și citire trebuie mutată poziția cu seekg sau seekp.

Exemple

Exemplul 1: Scriere, apoi citire din același flux

#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::fstream f("stoc.txt", std::ios::in | std::ios::out | std::ios::trunc);
    f << "mere 12\npere 5\n";

    f.seekg(0);   // înapoi la început pentru citire
    std::string produs;
    int cantitate;
    while (f >> produs >> cantitate) {
        std::cout << produs << ": " << cantitate << " kg\n";
    }
}

Rezultat

mere: 12 kg
pere: 5 kg

Exemplul 2: in | out nu creează fișierul

#include <fstream>
#include <iostream>

int main() {
    std::fstream f("inexistent.txt", std::ios::in | std::ios::out);
    std::cout << std::boolalpha << "Deschis: " << f.is_open() << '\n';
}

Rezultat

Deschis: false

Greșeli frecvente

  • Scrii și apoi citești fără seekg: poziția este la finalul textului scris, deci nu citești nimic.
  • Te aștepți ca std::ios::in | std::ios::out să creeze fișierul. Nu îl creează; adaugă std::ios::trunc sau creează-l întâi cu std::ofstream.

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::istream::seekg: Mută poziția de citire în flux (seekg) și arată poziția curentă (tellg).