Fișiere text: Definiție și operații specifice în C++
Introducere
Fișierele text sunt o parte esențială a programării în C++. Ele permit stocarea și recuperarea datelor sub formă de caractere, oferind o modalitate convenabilă de a organiza și partaja informații.
Definiție
Un fișier text este o colecție de caractere organizate pe linii. Fiecare linie se termină cu un caracter special numit newline (\n
). Fișierele text pot conține orice tip de caracter, inclusiv litere, cifre, simboluri și spații albe.
Operații specifice
C++ oferă o serie de operații specifice pentru manipularea fișierelor text.
Deschiderea unui fișier
Pentru a utiliza un fișier text, este necesar să îl deschideți mai întâi. Acest lucru se poate face folosind clasele ifstream
(pentru citire) sau ofstream
(pentru scriere) din biblioteca fstream
.
C++
// Deschiderea unui fișier pentru citire
ifstream fin("fisier.in");
// Deschiderea unui fișier pentru scriere
ofstream fout("fisier.out");
Citirea din fișier
După deschiderea fișierului, se pot citi caractere individuale, linii întregi sau blocuri de date.
C++
// Citirea unui caracter
char c = fin.get();
// Citirea unei linii
string linie;
getline(fin, linie);
// Citirea unui bloc de date
char buffer[1024];
fin.read(buffer, 1024);
#include <iostream>
#include <fstream>
int main() {
std::ifstream fin("exemplu.txt"); // Deschiderea fișierului "exemplu.txt" pentru citire
char c = fin.get(); // Citirea unui caracter
std::cout << "Primul caracter: " << c << std::endl;
std::string linie;
getline(fin, linie); // Citirea unei linii
std::cout << "Prima linie: " << linie << std::endl;
char buffer[1024];
int n = fin.read(buffer, 1024); // Citirea unui bloc de date
std::cout << "Numărul de octeți citiți: " << n << std::endl;
fin.close(); // Închiderea fișierului
return 0;
}
Acest exemplu de cod citește un caracter, o linie de text și un bloc de date binar din fișierul “exemplu.txt”. Conținutul citit este afișat pe consolă.
Programul realizează următoarele operații:
1. Citirea unui caracter:
char c = fin.get();
citește un singur caracter din fișierul asociat cu obiectulfin
și îl stochează în variabilac
.
2. Citirea unei linii:
string linie; getline(fin, linie);
citește o linie de text din fișier și o stochează în variabilalinie
. Funcțiagetline()
se oprește la primul caracter de sfârșit de linie (\n
) sau la sfârșitul fișierului.
3. Citirea unui bloc de date:
char buffer[1024]; fin.read(buffer, 1024);
citește până la 1024 de octeți din fișier și îi stochează în bufferulbuffer
. Numărul real de octeți citiți este stocat în variabilan
, care poate fi utilizată pentru a verifica dacă s-a atins sfârșitul fișierului.
Detalii suplimentare:
fin
este un obiect de tipifstream
, care este o clasă C++ utilizată pentru citirea din fișiere.get()
șiread()
sunt metode ale claseiifstream
utilizate pentru a citi date din fișier.getline()
este o funcție din biblioteca iostream utilizată pentru a citi o linie de text din fișier.- Bufferul este o zonă de memorie care stochează datele citite din fișier.
- Dimensiunea bufferului este de 1024 de octeți, ceea ce înseamnă că programul poate citi până la 1024 de octeți de date la o singură apelare a metodei
read()
.
Scrierea în fișier
Se pot scrie caractere individuale, linii întregi sau blocuri de date.
C++
#include <iostream>
#include <fstream>
int main() {
std::ofstream fout("exemplu.txt"); // Deschiderea fișierului "exemplu.txt" pentru scriere
fout.put('a'); // Scrierea caracterului 'a'
fout << "Acesta este un exemplu de linie" ; // Scrierea unei linii de text
// fout<<endl;
char buffer[1024] = {0}; // Declararea unui buffer de 1024 de octeți
// Umplerea bufferului cu date (de exemplu, numere, caractere)
fout.write(buffer, 1024); // Scrierea bufferului în fișier
fout.close(); // Închiderea fișierului
return 0;
}
Programul realizează următoarele operații:
1. Scrierea unui caracter:
fout.put('c');
scrie caracterul ‘c’ în fișierul asociat cu obiectulfout
.
2. Scrierea unei linii:
fout << "Acesta este un exemplu de linie" << endl;
scrie textul “Acesta este un exemplu de linie” în fișier, urmat de caracterul de sfârșit de linie (endl
).
3. Scrierea unui bloc de date:
fout.write(buffer, 1024);
scrie 1024 de octeți din bufferulbuffer
în fișier. Conținutul exact al bufferului nu este specificat în cod, dar ar putea conține orice tip de date, cum ar fi numere, caractere sau chiar alte blocuri de date.
Pe scurt, programul scrie un caracter, o linie de text și un bloc de date binar în fișierul asociat cu obiectul fout
.
Detalii suplimentare:
fout
este un obiect de tipofstream
, care este o clasă C++ utilizată pentru scrierea în fișiere.put()
șiwrite()
sunt metode ale claseiofstream
utilizate pentru a scrie date în fișier.endl
este un manipulator de flux care inserează un caracter de sfârșit de linie în fluxul de ieșire.- Bufferul este o zonă de memorie care stochează datele care urmează să fie scrise în fișier.
- Dimensiunea bufferului este de 1024 de octeți, ceea ce înseamnă că programul poate scrie până la 1024 de octeți de date la o singură apelare a metodei
write()
.
Închiderea fișierului
După finalizarea operațiunilor cu fișierul, este important să îl închideți pentru a elibera resursele sistemului.
C++
fin.close();
fout.close();
Exemple
Următoarele exemple demonstrează operațiile de bază cu fișiere text:
Exemplul 1: Citirea unui fișier text
C++
#include <iostream>
#include <fstream>
int main() {
// Deschiderea fișierului pentru citire
ifstream fin("fisier.in");
// Citirea fiecărei linii din fișier și afișarea pe ecran
string linie;
while (getline(fin, linie)) {
cout << linie << endl;
}
// Închiderea fișierului
fin.close();
return 0;
}
Exemplul 2: Scrierea unui fișier text
C++
#include <iostream>
#include <fstream>
int main() {
// Deschiderea fișierului pentru scriere
ofstream fout("fisier.out");
// Scrierea mai multor linii în fișier
fout << "Acesta este un exemplu de fișier text" << endl;
fout << "Acesta este al doilea rând" << endl;
// Închiderea fișierului
fout.close();
return 0;
}
Operații avansate
Pe lângă operațiile de bază prezentate anterior, C++ oferă funcții suplimentare pentru manipularea fișierelor text:
- Verificarea existenței unui fișier: Puteți folosi funcția
exists
din biblioteca<filesystem>
pentru a verifica dacă un fișier există înainte de a încerca să îl deschideți. - Poziționarea cursorului: Puteți folosi funcțiile
seekg
șiseekp
pentru a plasa cursorul de citire/scriere la o anumită poziție din fișier. - Copierea fișierelor: Biblioteca
fstream
oferă funcțiacopy
pentru copierea conținutului unui fișier în altul. - Renumarea fișierelor: Funcția
rename
din biblioteca<filesystem>
permite redenumirea fișierelor. - Ștergerea fișierelor: Funcția
remove
din biblioteca<filesystem>
permite ștergerea fișierelor.
Erori și gestionarea excepțiilor
Este important să gestionați corect erorile care pot apărea în timpul lucrului cu fișiere text. Puteți verifica starea de eroare a obiectelor ifstream
și ofstream
folosind metoda is_open
. De asemenea, este recomandat să utilizați blocuri try-catch
pentru a intercepta excepțiile și a trata erorile elegant.