Fisier text = succesiune de caractere ASCII ce se incheie cu caracterul EOF.

Accesul la caracterele scrise intr-un fisier text se poate face doar secvential, si poate fi :
  • Acces pentru citire
  • Acces pentru scriere

Toate utilitarele necesare pentru accesarea fisierelor text din programe C++ se afla in biblioteca fstream

Pentru a putea accesa un fişier text dintr-un program C++ trebuie declarata o variabila, astfel :
  • Pentru a avea acces la afisare in fişier : ofstream g;
  • Pentru a avea acces la citirea din fişier : ifstream f;

Cand ne hotarâm sa accesam fisierul, mai intai trebuie sa-l "deschidem". De fapt, creem legatura logica intre variabila declarata pentru accesarea fisierului si zona de pe disc unde se gaseste fisierul. Dupa crearea acestei legaturi, ori de cate ori dorim sa accesam fisierul vom accesa de fapt variabila asociata lui.
Exemplu:
1) initializare variabila de acces, la declarare:
ifstream f("intrare.txt");
ofstream g("iesire.txt");

2)initializare variabila de acces, dupa declarare

ifstream f;
f.open("intrare.txt");
ofstream g;
g.open("iesire.txt");
f.open("c:\\teza\\unu.in");
-
fișierul se caută pe calea specificată


Cand ne hotarâm sa nu mai accesam fisierul va trebui sa-l "inchidem". De fapt, distrugem legatura logica intre variabila declarata pentru accesarea fisierului si zona de pe disc unde se gaseste fisierul.
Exemplu: f.close(); g.close();


Afisarea in fisier

Se face la fel ca si afisarea pe ecran numai ca metoda cout se inlocuieste cu numele variabilei de acces la fisier.
Exemplu:

g<<17<<’ ’;
g<<"ana are mere"<<endl;

Aplicatie : Sa se afiseze in fisierul text rezultat.out, toate cifrele aranjate crescator si separate prin cate un spatiu.

#include <iostream>
#include <fstream>
using namespace std;
main()
{ unsigned int L;
ofstream g("rezultat.out");
for (L=0; L<=9; L++)
g<<L<<' ';
g.close();

}
OBS: Nu este nevoie sa creati fisierul “rezult.out”. Acesta va fi creat automat de program.

Citirea din fisier

Operatorul >> permite citirea datelor in variabila de orice tip, fara insa a trata caracterele albe ( spatii, salturi la linie noua ).

Citirea se face similar celei de la tastatura numai ca se inlocuieste metoda cin cu variabila de acces la fisier.


Ex1:Se considera fisierul text cifre.txt care contine pe o singura linie si separate prin spatii 10 numere intregi de maxim 4 cifre fiecare. Sa se afiseze pe ecran suma acestor numere.

#include <fstream>
#include <iostream>
using namespace std;
main()
{
int x; long s=0;
ifstream f("cifre.txt");
int i;
for(i=1;i<=10;i++) {
f>>x; s=s+x; }
f.close();
cout<<"suma este:"<<s;
}
Ex2: Se considera fisierul text cifre2.txt care contine: pe prima linie numarul natural nenul n (n<=50)
iar pe linia a doua, separate prin spatiu, n numere naturale cu maxim 9 cifre fiecare. Sa se afiseze pe ecran cel mai mare dintre cele n numere.

#include <iostream>
#include <fstream>
using namespace std;

main() {
long x, max; int n,i;
ifstream f("cifre2.txt");
f>>n>>max;
for(i=2;i<=n;i++) {
f>>x;
if (x>max) max=x;
}
f.close();
cout<<"Maximul este: "<<max;
}

Functia eof() si get()

  • Functia get() permite citirea unui caracter de orice fel (inclusiv spatiu ori salt la linie noua).
    • De exemplu, pentru citirea caracterelor (char sau unsigned char) se poate utiliza astfel:
      ifstream f1("text.in");
      char c;
      f1.get(c);
      Am citit primul caracter din fisier, indiferent daca este sau nu caracter alb.

  • Funcţia eof() determina daca s-a ajuns la sfarsitul fisierului sau nu .Funcia eof() returneaz valoarea 0 daca nu am ajuns la sfârsitul fisierului, respectiv o valoare diferită de 0 daca am ajuns la sfârsit.
    • Exemplu
      Vom citi si vom numara toate caracterele existente într-un fisier, pâna la sfârsitul acestuia.
      ifstream fin("text.in");
      char c;
      long int nr=0;
      while (!fin.eof()) {fin.get(c); nr++;}
      cout<<"Fisierul contine "<<nr<<" caractere\n";
      Functia membru get() returneaz pointerul de fisier (pozitia curenta în flux). Prin urmare secvena de program ar putea fi rescrisa si astfel:
      ifstream fin("text.in");
      char c;
      long int nr=0;
      while (fin.get(c)) nr++;
      cout<<"Fisierul contine "<<nr<<" caractere\n";

Ex3. Se considera fisierul text cinci.in care contine mai multe linii, pe fiecare linie aflandu-se numere naturale cu cel mult 8 cifre fiecare, separate prin spatiu. Cate linii contine fisierul ?

#include <iostream>
#include <fstream>
using namespace std;

main() {
int nr=0; long x;
char c;
ifstream f("cinci.in");
while (f>>x) {f.get(c);
if ( c=='\n') nr++;
}
f.close();
cout<<nr;
system("pause");
}
Ex4.se considera fisierul text unu.in care contine doua linii de text. Cate spatii se afla pe fiecare linie ?

#include <iostream>
#include <fstream>
using namespace std;

main() {
char c; int nr=0;
ifstream f("1.txt");
do
{f.get(c);
if (c==' ') nr++;} while ( c!='\n') ;
cout<<nr<<' '; nr=0;
f.get(c); /* citim enter-ul */
//analog ca mai sus dar prin alta metoda echivalenta
while (!f.eof() ) {
f.get(c); if (c==' ') nr++; }
f.close();
cout<<nr;
system("pause");
}


Exercitii de consolidare:

1. Dintr-un fisier care contine o secventa de numere intregi, scrise fiecare pe un rand, sa se creeze doua fisiere: unul cu numerele pare si altul cu numerele impare

2.Scrieti un program care genereaza toate numerele prime strict mai mici decat n(n nr natural).Valoarea variabilei n se citeste de la tastatura. Numerele prime generate vor fi scrise in fisierul text prime.txt, cate unul pe linie.

3.In fisierul text alfa.txt se afla mai multe numere naturale, fiecare scrise pe un singur rand. Sa se creeze fisierul pare.txt care sa contina cate una pe linie, doar acele valori, din fisierul numere.txt, care au suma cifrelor un numar par.

4.Pe prima linie a fisierului text alfa.txt se gaseste o succesiune de cel mult 1000 de caractere, caractere care pot fi doar litere mici.Scrieti un program care citeste de la tastatura un numar natural n si un caracter ch si stabileste daca caracterul ch apare de exact n ori in fisier.Programul afiseaza "da" sau "nu" .

5.Scrieti programul care citeste de la tastatura un numar natural n (0<n<=15) si o litera c, si creeaza un fisier text caracter.txt, ce contine pe prima linie un caracter c,pe a doua 2 caractere c, pe a 3-a linie 3 caractere c...ultima linie n va contine contine n caractere


Exercitii de BACALAUREAT:

1. Fişierul text bac.txt conţine, pe o singură linie, cel mult 1000 de numere naturale nenule cu cel mult 4 cifre fiecare, numerele fiind separate prin câte un spaţiu. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul n (n≤999) şi numerele din fişierul
bac.txt şi care afişează pe ecran, separate prin câte un spaţiu, toate numerele din fişier care sunt divizibile cu n. Dacă fişierul nu conţine niciun astfel de număr, atunci se va afişa pe ecran mesajul NU EXISTA.
Exemplu: dacă fişierul bac.txt conţine numerele: 3 100 40 70 25 5 80 6 3798 123,
pentru n=10 atunci pe ecran se va afişa: 100 40 70 80

2.Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n cu cel mult 8 cifre (n≥10) şi care creează fişierul text NR.TXT ce conţine numărul n şi toate prefixele nenule ale acestuia, pe o singură linie, separate prin câte un spaţiu, în ordine descrescătoare a valorii lor.
Exemplu: pentru n=10305 fişierul NR.TXT va conţine numerele: 10305 1030 103 10 1

3. Fişierul BAC.TXT conţine pe prima linie un număr natural n (0<n≤1000) şi pe a doua linie, separate prin câte un spaţiu, n numere naturale nenule (cu cel mult 9 cifre fiecare). Scrieţi un program C/C++ care citeşte toate numerele din fişier şi afişează pe ecran câte numere prime conţine şirul citit de pe a doua linie a fişierului.
Exemplu: dacă fişierul are conţinutul
5
12 3 9 7 1
se va afişa pe ecran valoarea 2 (în şirul dat există două numere prime şi anume 3 şi 7).(10p.)