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.

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.

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.

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

Urmatoarea lectie

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

Continua →