Conectează-te Înregistrare gratuită
Informatică Liceu (9-12)

Fisiere text si binare (citire, scriere, prelucrari)

Fisierele reprezinta o modalitate de stocare permanenta a datelor, spre deosebire de variabilele din memorie care se pierd la terminarea programului. In limbajul C++, lucrul cu fisiere se face prin intermediul bibliotecii <fstream>, care pune la dispozitie trei clase principale: ifstream pentru citire (input file stream), ofstream pentru scriere (output file stream) si fstream pentru operatii atat de citire cat si de scriere. Clasificarea fisierelor in text si binare este esentiala: fisierele text stocheaza datele sub forma de caractere lizibile (de exemplu, numerele sunt scrise ca siruri de cifre separate prin spatii sau newline), iar fisierele binare stocheaza datele exact ca in memorie, in format binar, ceea ce le face mai compacte si mai rapide de procesat, dar neinteligibile direct pentru om.

Deschiderea unui fisier se face prin constructorul clasei sau prin metoda open(), iar inchiderea prin close() (desi destructorul o face automat la iesirea din scop). Pentru a verifica succesul deschiderii se foloseste operatorul ! sau metoda fail(). Citirea dintr-un fisier text se face cu operatorul >> (care citeste pana la spatiu sau newline) sau cu functii precum getline() pentru linii intregi, iar scrierea cu operatorul <<.

Pentru fisiere binare se folosesc functiile read() si write(), care primesc un pointer la memorie (de tip char*) si numarul de bytes de citit/scris. Este important ca la scrierea binara sa se serializeze corect datele, eventual prin conversia void*. Citirea pana la sfarsitul fisierului (EOF) se verifica prin metoda eof() sau prin testarea stream-ului dupa citire (ex: while(fin >> x)).

Prelucrarile uzuale includ: afisarea continutului, cautarea unui text, inlocuirea unor cuvinte, sortarea numerelor din fisier, sau operatii pe fisiere binare (de exemplu, modificarea unui inregistrari la o anumita pozitie folosind seekg() si seekp() pentru pozitionare). O atentie deosebita se acorda modurilor de deschidere: ios::in, ios::out, ios::app (append), ios::binary, ios::trunc (stergere continut existent). In contextul Bacalaureatului, se cer frecvent probleme de citire a unor numere sau cuvinte dintr-un fisier text, prelucrarea lor (de exemplu, calculul mediei, numararea aparitiilor) si scrierea rezultatelor intr-un alt fisier.

De asemenea, se intalnesc probleme cu fisiere binare unde se cere actualizarea unor inregistrari. Stapanirea acestor concepte este fundamentala pentru rezolvarea subiectelor de informatica la liceu.

Exemple

  • Exemplul 1: Citirea numerelor dintr-un fisier text si afisarea sumei.
Fisierul 'date.in' contine numere separate prin spatii: 10 20 30 40. Programul citeste numerele pana la sfarsitul fisierului, calculeaza suma si o afiseaza pe ecran.

Cod

#include <iostream>

#include <fstream>

using namespace std;

int main() {

ifstream fin("date.in");

int x, suma = 0;

while(fin >> x) {

suma += x;

}

fin.close();

cout << "Suma = " << suma;

return 0;

}

Rezultat afisat: Suma = 100

  • Exemplul 2: Scrierea in fisier binar a unui vector de numere intregi si apoi citirea lui.
Se defineste un vector cu 5 elemente: {1, 2, 3, 4, 5}. Se scrie in fisierul 'date.bin' folosind ofstream cu modul ios::binary, apoi se citeste cu ifstream in alt vector si se afiseaza.

Cod

#include <iostream>

#include <fstream>

using namespace std;

int main() {

int v[] = {1, 2, 3, 4, 5};

ofstream fout("date.bin", ios::binary);

fout.write((char*)v, 5 * sizeof(int));

fout.close();

int w[5];

ifstream fin("date.bin", ios::binary);

fin.read((char*)w, 5 * sizeof(int));

fin.close();

for(int i = 0; i < 5; i++) cout << w[i] << ' ';

return 0;

}

Output: 1 2 3 4 5

  • Exemplul 3: Copierea continutului unui fisier text in altul, inversand ordinea liniilor.
Fisierul 'in.txt' contine pe fiecare linie cate un cuvant: Ana, are, mere. Se citeste totul intr-un vector de stringuri, apoi se scrie in 'out.txt' in ordine inversa: mere, are, Ana.

Cod

#include <iostream>

#include <fstream>

#include <vector>

#include <string>

using namespace std;

int main() {

ifstream fin("in.txt");

vector<string> linii;

string line;

while(getline(fin, line)) {

linii.push_back(line);

}

fin.close();

ofstream fout("out.txt");

for(int i = linii.size()-1; i >= 0; i--) {

fout << linii[i] << endl;

}

fout.close();

return 0;

}

Concepte cheie: Clasele ifstream, ofstream, fstream, Modurile de deschidere: in, out, app, binary, trunc, Citire/scriere text cu operatorii >> si << si functia getline(), Citire/scriere binara cu read() si write(), Verificarea sfarsitului de fisier (eof) si a erorilor (fail, good), Pozitionarea in fisier cu seekg, seekp, tellg, tellp

Vrei exerciții pe lecția asta + AI care te ajută pas cu pas?
Cont gratuit — 20 întrebări AI/zi, exerciții nelimitate.

Creează cont