Invatare Atomica

Fisiere text: deschidere, citire, scriere

Nota curriculum: Aceasta tema corespunde clasei a IX-a, sectiunea 3.3 (intensiv informatica). Ea apare in modulul cls12 din cauza unei reorganizari de curs; continutul si competentele vizate sunt cele din programa cls IX.
Progres lectie:
0%
🎯

Obiectivul lectiei

Vei invata sa deschizi, citesti, scrii si inchizi fisiere text in Python si C++, si sa procesezi date structurate salvate pe disc.

Dupa aceasta lectie vei putea:

  • Sa deschizi un fisier text in Python cu open() si modurile r, w, a
  • Sa citesti cu read(), readline(), readlines() si iteratie directa
  • Sa scrii si sa adaugi date cu write() si modul a
  • Sa folosesti blocul with pentru inchiderea automata a fisierelor
  • Sa procesezi date structurate (CSV simplu) dintr-un fisier
  • EXCLUSIV INTENSIV Sa lucrezi cu fisiere in C++ cu ifstream si ofstream

Incearca singur!

Provocare:

Gandeste-te: de ce salvam date in fisiere si nu doar in variabile? Ce se intampla cu variabilele cand programul se inchide?

💡 Ai nevoie de un indiciu?

Variabilele traiesc doar cat ruleaza programul. Un fisier pastreaza datele permanent pe disc.

Exemplu: un jurnal de note salvat in fisier poate fi citit maine sau de un alt program.

1

1. De ce avem nevoie de fisiere?

Un fisier text este o secventa de caractere salvata pe disc, organizata pe linii. Spre deosebire de variabile (memorie RAM, volatile), fisierele sunt persistente: supravietuiesc inchiderii programului.
Analogie: caietul vs memoria de lucru

Memoria RAM este ca ce tii minte in cap acum - dispare cand adormi. Fisierul pe disc este ca ce scrii in caiet - ramane si a doua zi. Programele cu date persistente (jurnale, configurari, baze de date simple) au nevoie de fisiere.

Ciclul complet de lucru cu un fisier:
  1. Deschide fisierul (specifici numele si modul)
  2. Citeste sau Scrie date
  3. Inchide fisierul (elibereaza resurse OS, goleste buffer-ul)
2

2. Deschiderea fisierelor in Python - open()

Functia open(nume_fisier, mod, encoding) returneaza un obiect de tip TextIOWrapper. Specifica intotdeauna encoding="utf-8".
Moduri de deschidere
ModActiuneDaca fisierul nu exista
"r"CitireEroare FileNotFoundError
"w"Scriere (suprascrie tot)Il creeaza
"a"Adaugare la sfarsitIl creeaza
"r+"Citire si scriereEroare
"x"Creare exclusivaIl creeaza; eroare daca exista
# Recomandat: blocul with inchide fisierul automat
with open("jurnal.txt", "w", encoding="utf-8") as f:
    f.write("Prima intrare
")
# Fisierul este deja inchis automat dupa bloc

# Fara with: trebuie close() explicit
f = open("jurnal.txt", "r", encoding="utf-8")
date = f.read()
f.close()  # obligatoriu fara with!
Regula de aur: foloseste intotdeauna with

Blocul with garanteaza ca fisierul se inchide chiar si cand apare o eroare. Fara close(), datele pot ramane in buffer.

3

3. Scrierea in fisiere - write() si modul append

# Scriere initiala (creeaza sau suprascrie fisierul)
with open("demo.txt", "w", encoding="utf-8") as f:
    f.write("Linia 1: Python fisiere
")
    f.write("Linia 2: deschidere si scriere
")
    f.write("Linia 3: sfarsit
")
print("Fisier creat cu succes.")
print("Continut scris: 3 linii")
Output real (rulat cu python):
Fisier creat cu succes.
Continut scris: 3 linii
# Adaugare la fisier existent (modul a = append)
with open("demo.txt", "a", encoding="utf-8") as f:
    f.write("Linia 4: adaugata cu append
")

with open("demo.txt", "r", encoding="utf-8") as f:
    for i, linie in enumerate(f, 1):
        print(f"Linia {i}: {linie.strip()}")
Output real (rulat cu python):
Linia 1: Linia 1: Python fisiere
Linia 2: Linia 2: deschidere si scriere
Linia 3: Linia 3: sfarsit
Linia 4: Linia 4: adaugata cu append
Atentie: write() nu adauga automat newline!

write() scrie exact ce ii dai. Adauga explicit backslash-n la sfarsitul fiecarui rand.

4

4. Metode de citire in Python

Premisa: demo.txt exista

Codul de mai jos citeste fisierul demo.txt creat in atomul 3 (Scrierea in fisiere). Ruleaza intai atomul 3, apoi acest atom.

Exista 4 moduri principale de citire, in functie de dimensiunea fisierului si ce vrei sa faci cu datele.
# Metoda 1: read() - tot textul ca un singur string
with open("demo.txt", "r", encoding="utf-8") as f:
    continut = f.read()
print("=== read() ===")
print(continut)
Output real (rulat cu python):
=== read() ===
Linia 1: Python fisiere
Linia 2: deschidere si scriere
Linia 3: sfarsit
# Metoda 2: readline() - o linie la un moment dat
with open("demo.txt", "r", encoding="utf-8") as f:
    linie = f.readline()
    while linie:
        print(repr(linie))
        linie = f.readline()
Output real (rulat cu python):
'Linia 1: Python fisiere
'
'Linia 2: deschidere si scriere
'
'Linia 3: sfarsit
'
# Metoda 3: readlines() - toate liniile ca lista
with open("demo.txt", "r", encoding="utf-8") as f:
    linii = f.readlines()
print(f"Numar linii: {len(linii)}")
print(f"Prima linie: {linii[0].strip()}")

# Metoda 4: iteratie directa (RECOMANDATA - O(1) memorie)
with open("demo.txt", "r", encoding="utf-8") as f:
    for linie in f:
        print(linie.strip())
Output real (rulat cu python):
Numar linii: 3
Prima linie: Linia 1: Python fisiere
Complexitate memorie:
  • read() si readlines() - O(N) memorie (incarca TOT fisierul)
  • Iteratia directa for linie in f - O(1) memorie per pas (recomandat pentru fisiere mari)
5

5. Aplicatie: procesare date structurate (CSV simplu)

Format comun: date separate prin virgula, cate un record pe linie (CSV simplu - Comma-Separated Values).
# Cream fisierul de date (note.txt)
with open("note.txt", "w", encoding="utf-8") as f:
    f.write("Ana,9
Bogdan,7
Carla,10
Dan,8
Elena,6
")

total = 0; count = 0; max_nota = -1; max_elev = ""

with open("note.txt", "r", encoding="utf-8") as f:
    for linie in f:
        linie = linie.strip()
        if linie:
            elev, nota_str = linie.split(",")
            nota = int(nota_str)
            total += nota; count += 1
            if nota > max_nota:
                max_nota = nota; max_elev = elev

media = total / count
print(f"Numar elevi: {count}")
print(f"Media clasei: {media:.2f}")
print(f"Cel mai bun elev: {max_elev} cu nota {max_nota}")

with open("raport.txt", "w", encoding="utf-8") as f:
    f.write(f"Raport note
Numar elevi: {count}
Media clasei: {media:.2f}
")
print("Raport salvat in raport.txt")
Output real (rulat cu python):
Numar elevi: 5
Media clasei: 8.00
Cel mai bun elev: Carla cu nota 10
Raport salvat in raport.txt
Complexitate: O(N) timp, O(1) memorie suplimentara (procesam linie cu linie, nu incarcam tot).
6

6. Fisiere in C++ - ifstream si ofstream EXCLUSIV INTENSIV

⚡ Sectiune exclusiv intensiv informatica

In C++, fisierele se gestioneaza prin clasele din <fstream>. Verificarea cu is_open() este obligatorie in cod de productie.

Header necesar: #include <fstream> | ofstream = scriere | ifstream = citire
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main() {
    ofstream fout("demo_cpp.txt");
    if (!fout.is_open()) {
        cerr << "Eroare!" << endl; return 1;
    }
    fout << "L1: C++ fisiere text" << endl;
    fout << "L2: ofstream pentru scriere" << endl;
    fout << "L3: sfarsit" << endl;
    fout.close();
    cout << "Fisier creat cu succes." << endl;
    ifstream fin("demo_cpp.txt");
    if (!fin.is_open()) {
        cerr << "Eroare citire!" << endl; return 1;
    }
    string linie; int nr = 0;
    cout << "=== Continut fisier ===" << endl;
    while (getline(fin, linie)) {
        nr++;
        cout << "Linia " << nr << ": " << linie << endl;
    }
    fin.close();
    cout << "Total linii citite: " << nr << endl;
    return 0;
}
Output real (compilat g++ -std=c++17, rulat):
Fisier creat cu succes.
=== Continut fisier ===
Linia 1: L1: C++ fisiere text
Linia 2: L2: ofstream pentru scriere
Linia 3: L3: sfarsit
Total linii citite: 3
Python vs C++ pentru fisiere:
AspectPythonC++
Headerbuilt-in#include fstream
Scriereopen(f,w)ofstream fout(f)
Citireopen(f,r)ifstream fin(f)
Citire liniefor l in fgetline(fin, linie)
Verificaretry/exceptif (!fin.is_open())
Inchidereautomata cu withfin.close() explicit
⚡ Aplicatie C++: procesare CSV cu stringstream
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
int main() {
    ifstream fin("note.txt");
    if (!fin.is_open()) { cerr << "Eroare!" << endl; return 1; }
    string linie, elev, nota_str, max_elev;
    int nota, total=0, count=0, max_nota=-1;
    while (getline(fin, linie)) {
        if (linie.empty()) continue;
        stringstream ss(linie);
        getline(ss, elev, ',' );
        getline(ss, nota_str);
        nota = stoi(nota_str);
        total += nota; count++;
        if (nota > max_nota) { max_nota=nota; max_elev=elev; }
    }
    fin.close();
    cout << "Numar elevi: " << count << endl;
    cout << "Media clasei: " << (double)total/count << endl;
    cout << "Cel mai bun elev: " << max_elev << " cu nota " << max_nota << endl;
    return 0;
}
Output real (compilat g++ -std=c++17, rulat cu note.txt din atomul 5):
Numar elevi: 5
Media clasei: 8
Cel mai bun elev: Carla cu nota 10

Exercitii practice

Exercitiul 1 (Nivel minim) — Scriere simpla

Scrie un program Python care creeaza fisierul salut.txt si scrie in el 5 salutari, cate una pe linie. Citeste si afiseaza continutul.

Vezi rezolvarea

Rezolvare: se foloseste blocul with pentru scriere, apoi un al doilea bloc with pentru citire (ca la Atomul 3 din lectie).

  1. Scriem 5 salutari, cate unul pe linie. Atentie: write() NU adauga automat newline, deci punem \n manual: with open("salut.txt", "w", encoding="utf-8") as f:
      for i in range(1, 6): f.write(f"Salut numarul {i}\n")
  2. Citim si afisam continutul: with open("salut.txt", "r", encoding="utf-8") as f: print(f.read())
  3. Rezultat asteptat pe ecran: 5 linii, de la "Salut numarul 1" pana la "Salut numarul 5", fiecare pe randul ei.

Exercitiul 2 (Nivel standard) — Jurnal de temperaturi

Scrie un program Python care scrie in temperaturi.txt temperaturile din 7 zile in format Zi,Temperatura, citeste fisierul, calculeaza media si ziua cu temperatura maxima si salveaza raportul.

Vezi rezolvarea

Rezolvare pas cu pas (aceeasi tehnica ca la Atomul 5 - procesare CSV simplu):

  1. Scriem 7 linii in temperaturi.txt, format Zi,Temperatura: date = [("Luni",18),("Marti",21),("Miercuri",19),("Joi",23),("Vineri",25),("Sambata",22),("Duminica",20)], apoi pentru fiecare pereche f.write(f"{zi},{t}\n").
  2. Citim fisierul linie cu linie, facem linie.strip() apoi zi, t_str = linie.split(",") si convertim cu int(t_str), exact ca in exemplul cu note.txt.
  3. Calculam total si count pentru medie (media = total/count) si tinem max_temp/zi_max pe masura ce parcurgem.
  4. Cu datele de mai sus: media = (18+21+19+23+25+22+20)/7 = 148/7 = 21.14, iar ziua cu maxim este Vineri, 25 grade.
  5. Salvam raportul in raport.txt cu write(), la fel ca in Atomul 5.

Exercitiul 3 (Nivel performanta) — EXCLUSIV INTENSIV Log parser C++

Program C++ care citeste un fisier de log cu linii de forma NIVEL:mesaj. Numara ERROR/WARNING/INFO, scrie in erori.txt doar liniile ERROR si afiseaza statistici. Indiciu: stringstream si getline(ss, token, ':') pentru a separa nivelul.

Vezi rezolvarea

Schita de rezolvare (nivel performanta - structura, nu cod complet):

  1. Deschide log-ul cu ifstream si verifica is_open(), ca in Atomul 6.
  2. Citeste linie cu linie cu getline(fin, linie) (tehnica predata explicit la lectie).
  3. Separarea NIVEL:mesaj prin stringstream si getline(ss, token, ':') NU apare in aceasta lectie (Atomul 6 arata doar getline pe linii intregi, nu si stringstream pentru separare pe caracter) - e o informatie in plus fata de ce s-a predat; documenteaza-te sau foloseste linie.find(':') + substr(), care se pot deduce din ce stii deja despre string-uri.
  4. Tine 3 contoare (ERROR, WARNING, INFO) si incrementeaza-le dupa nivelul extras.
  5. Deschide erori.txt cu ofstream si scrie doar liniile unde nivelul este exact "ERROR".
  6. La final afiseaza cu cout cele 3 totaluri.

Capcane: uitarea lui is_open() pe oricare fisier; spatii extra intre ':' si mesaj pot strica o comparatie exacta de string.

Criterii de evaluare: deschidere+verificare ambele fisiere (2p), separare corecta NIVEL/mesaj (3p), numarare corecta pe cele 3 categorii (2p), scriere corecta doar a liniilor ERROR (2p), afisare clara a statisticilor (1p).

Ce ai invatat astazi

  • De ce sunt necesare fisierele text (persistenta datelor pe disc)
  • Functia open() cu modurile r, w, a, r+
  • Blocul with ca metoda recomandata (inchidere automata)
  • Metodele de citire: read(), readline(), readlines(), iteratie directa
  • Procesarea datelor CSV: strip() + split(virgula)
  • Complexitatea O(N) timp si O(1) memorie la procesare linie-cu-linie
  • EXCLUSIV INTENSIV ifstream/ofstream in C++, getline(), is_open(), stringstream

Vrei mai mult?

Provocare: Porneste de la note.txt din lectie (Ana,9 / Bogdan,7 / Carla,10 / Dan,8 / Elena,6). Adauga cod care gaseste nota minima si elevul cu nota minima, apoi adauga (nu suprascrie) aceasta informatie in raport.txt existent, folosind modul "a". Verifica ca raportul contine acum si media, si maximul, si minimul, fara sa fi pierdut ce era scris inainte.

De gandit: write() nu adauga automat \n la sfarsitul textului, spre deosebire de print(). Daca liniile din note.txt ar fi fost scrise fara \n intre ele, ce s-ar fi intamplat la citirea cu split(",") - de ce codul ar fi picat cu eroare in loc sa mearga mai departe?

Deschidere: Orice aplicatie care isi aminteste ceva intre doua porniri - un joc care salveaza scorul, un editor care isi aminteste ultimele fisiere deschise, un server care scrie un jurnal (log) cu fiecare cerere primita - face exact ce ai facut aici: deschide un fisier text, scrie sau citeste linie cu linie, si il inchide corect.

Urmatoarea lectie

In lectia urmatoare vei invata sa construiesti interfete grafice simple cu Tkinter.

Continua →