Fișiere text: Definiție și operații specifice în C++

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 obiectul fin și îl stochează în variabila c.

2. Citirea unei linii:

  • string linie; getline(fin, linie); citește o linie de text din fișier și o stochează în variabila linie. Funcția getline() 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 bufferul buffer. Numărul real de octeți citiți este stocat în variabila n, care poate fi utilizată pentru a verifica dacă s-a atins sfârșitul fișierului.

Detalii suplimentare:

  • fin este un obiect de tip ifstream, care este o clasă C++ utilizată pentru citirea din fișiere.
  • get() și read() sunt metode ale clasei ifstream 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 obiectul fout.

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 bufferul buffer î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 tip ofstream, care este o clasă C++ utilizată pentru scrierea în fișiere.
  • put() și write() sunt metode ale clasei ofstream 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 și seekp pentru a plasa cursorul de citire/scriere la o anumită poziție din fișier.
  • Copierea fișierelor: Biblioteca fstream oferă funcția copy 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.