Fișiere - Proceduri și tipuri de acces

Fișierul este o colecție organizată de date memorată pe un dispozitiv de stocare.

  În esență, un fișier text este o colecție de caractere grupate pe rânduri ce pot avea lungimi diferite. În general se folosesc fișiere atunci când vrem să citim mai multe date odată și pentru a nu fi nevoiți să introducem date de la tastatură, se presupune că le avem deja scrise într-un fișier.

Implemetarea fișierelor text în C++

Includerea bibliotecii

  Atunci când lucrăm cu fișiere, va trebui întotdeauna să includem biblioteca specifică fișierelor, adică <fstream>
  Spre exemplu, dacă știm că într-o problemă operăm cu fișiere, în directiva de preprocesare va apărea și instrucțiunea #include <fstream>.

Citirea din fișier

  Când vrem să citim date dintr-un fișier trebuie să „declarăm” această operație prin scrierea unei instrucțiuni (prezentă de obicei înaintea tuturor subprogramelor, după directiva de preprocesare) de forma:

ifstream <nume_obiect> ("<nume_fisier>");, unde:

  • <nume_obiect> este numele obiectului (pointerului) care va asigura citirea;
  • <nume_fisier> este numele fișierului din care se face citirea.

Exemplu:

#include <fstream>
using namespace std;
ifstream fin ("date.in");
int n;
int main(){
  fin>>n;
  <...>
  return 0;
}

  În programul de mai sus am descris o simplă citire a unei variabile din fișierul date.in.
  Numele pointerului am ales să fie fin deoarece numește sugestiv citirea dintr-un fișier (fin = f-„fișier” + in; la fel ca la cin = c-„consolă” + in). Numele acestuia poate fi orice alt cuvânt sau literă, dar cele mai comune sunt fin, in, sau f.
  Deoarece nu am folosit citirea de la tastatură, am putut renunța la includerea bibliotecii <iostream>.

Scrierea în fișier

  Când vrem să scriem date într-un fișier trebuie scrisă instrucțiunea prin care se definește operația. Ea este de forma:

ofstream <nume_obiect> ("<nume_fisier>");, unde:

  • <nume_obiect> este numele obiectului (pointerului) care va asigura scrierea în fișierul dorit;
  • <nume_fisier> este numele fișierului în care se face scrierea.

Exemplu:

#include <iostream>
#include <fstream>
using namespace std;
ofstream fout ("date.out");
int n;
int main(){
  cin>>n;
  <...>
  fout<<n;
  return 0;
}

  Algoritmul precedent conține o citire de la tastatură a unui număr, prelucrarea acestuia și scrierea lui în fișierul date.out.
  Numele pointerului care marchează scrierea în fișier este fout, deoarece este sugestiv rolului său (fout = f-„fișier” + out). Dintre cele mai comune nume folosite se numără fout, out, sau g.
  Folosind o citire de la tastatură pentru numărul n, am scris și includerea bibliotecii <iostream> în directiva de preprocesare.


Problemă rezolvată

  În fișierul text numere.txt se află mai multe numere naturale din intervalul [0,10000], scrise pe un singur rând. Să se creeze fișierul pare.out care să conțină, câte una pe linie, doar acele valori, din fișierul numere.txt, care au suma cifrelor un număr par.

#include <fstream>
using namespace std;
ifstream in ("numere.txt");
ofstream out ("pare.out");
int main (){
  int n, s, aux;
  while(in>>n){
    s=0;aux=n;
    while(aux){
      s+=n%10;
      aux/=10;
    }
    if(s%2==0) out<<n<<'\n';
  }
  return 0;
}
a)
// numere.txt
3 10 5405 30 35 112 5123
// pare.out
35
112
5405
b)
// numere.txt
900 456 8436 3684 1 412
// pare.out

  La realizarea acestui program vom începe cu declarațiile fișierelor și al bibliotecilor. În subprogramul principal declarăm local variabilele de care vom avea nevoie și vom iniția o structura repetitivă while care se va executa cât timp încă mai avem valori de citit din fișier.
  La fiecare pas vom calcula suma cifrelor numărului citit și în cazul în care aceasta este pară, vom scrie în fișierul pare.out numărul respectiv urmat de un rând nou.