1. De ce avem nevoie de fisiere?
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.
- Deschide fisierul (specifici numele si modul)
- Citeste sau Scrie date
- Inchide fisierul (elibereaza resurse OS, goleste buffer-ul)
2. Deschiderea fisierelor in Python - open()
open(nume_fisier, mod, encoding) returneaza un obiect de tip TextIOWrapper. Specifica intotdeauna encoding="utf-8".| Mod | Actiune | Daca fisierul nu exista |
|---|---|---|
"r" | Citire | Eroare FileNotFoundError |
"w" | Scriere (suprascrie tot) | Il creeaza |
"a" | Adaugare la sfarsit | Il creeaza |
"r+" | Citire si scriere | Eroare |
"x" | Creare exclusiva | Il 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!
withBlocul with garanteaza ca fisierul se inchide chiar si cand apare o eroare. Fara close(), datele pot ramane in buffer.
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")
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()}")
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
write() scrie exact ce ii dai. Adauga explicit backslash-n la sfarsitul fiecarui rand.
4. Metode de citire in Python
Codul de mai jos citeste fisierul demo.txt creat in atomul 3 (Scrierea in fisiere). Ruleaza intai atomul 3, apoi acest atom.
# 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)
=== 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()
'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())
Numar linii: 3 Prima linie: Linia 1: Python fisiere
- 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. Aplicatie: procesare date structurate (CSV simplu)
# 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")
Numar elevi: 5 Media clasei: 8.00 Cel mai bun elev: Carla cu nota 10 Raport salvat in raport.txt
6. Fisiere in C++ - ifstream si ofstream EXCLUSIV INTENSIV
In C++, fisierele se gestioneaza prin clasele din <fstream>. Verificarea cu is_open() este obligatorie in cod de productie.
#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; }
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
| Aspect | Python | C++ |
|---|---|---|
| Header | built-in | #include fstream |
| Scriere | open(f,w) | ofstream fout(f) |
| Citire | open(f,r) | ifstream fin(f) |
| Citire linie | for l in f | getline(fin, linie) |
| Verificare | try/except | if (!fin.is_open()) |
| Inchidere | automata cu with | fin.close() explicit |
#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; }
Numar elevi: 5 Media clasei: 8 Cel mai bun elev: Carla cu nota 10