Fisiere

 Fisiere
Fisierul este o structura de date externa formata dintr-o multime ordonata de inregistrari , ordonarea facanduse dupa nr. inregistrarii . Fisierul este memorat pe un suport de memorare numit volum.

Prelucrarea datelor dintr-un fisier se refera la urmatoarele operatii:
-deschiderea fisierului
-exploatarea fisierului(adaugare, stergere)
-inchiderea fisierului
In limbajul c++ sunt implementate doua tipuri de fisiere:
-fisiere text (contin numai caractere reprezentate in codul ascii,iar inregistrarea reprezinta o linie de text)
-fisiere binare (inregistrarile sunt de acelasi tip sau sunt structuri de date organizate sub forma unor colectii de campuri)
Citirea datelor in fisier:
*Limbajul pascal:
-definirea identificatorului de fisier var id_f:text;
-asocierea dintre fisierul fizic si identificator: assign(id_f.’nume_f’);
-deschiderea fisierului pentru citire: reset(id_f);
-citirea variabilelor din fisiere se face cu ajutorul procedurilor: read si readln
read(id_f,id_v1[,idv2,..,id_vn]);
readln(id_f,id_v1[,idv2,..,id_vn]);
unde id_v1,id_v2,…,id_vn sunt identificatori de variabile elementare de orice tip,cu exceptia celor logice
-inchiderea fisierului:
close(id_f).
*Limbajul C++:
#include
-implementarea fisierelor de tip text:
fstream id_f([cale\\]nume_f,ios;;in); sau
ifstream id_f(„nume_f”);
Prin implementare,fisierul este edschis pentru citire
-citirea se face astfel:
id_f>>id_v1[>>id_v2>>   >>idvn];
unde id_v1,id_v2,….id_vn sunt identificatori de variabile elementare de orice tip
-inchiderea fisierului:
id_f.close();

Scrierea in fisiere text:
*Limbajul pascal:
-definirea identificatorului de fisier
var id_f:text;
-asocierea dintre fisierul fizic si identificator:
assign(id_f,’nume_f’);
-deschiderea fisierului pentru scriere:
rewrite(id_f);
-scrierea variabilelor in fisier se face cu ajutorul procedurilor write si writeln:
write(id_f,id1[,id2,…idn]);
writeln(id_f,id1[,id2,…idn]);
unde id1,id2,…,idn sunt identificatori de variabile elementare de orice tip sau de constante
-inchiderea fisierului:
close(id_f);
*Limbajul C++:
#include
-implementarea fisiereor de tip text:
fstream id_f([cale\\]”nume_f”); sau
ofstream id_f([cale\\]”nume_f”);
Prin implementare,fisierul este deschis pentru scriere.
-scrierea in fisier se face astfel:
id_f<<id_v1[<<id_v2<<…<<id_vn];<id_v1[><id_v2><id_vn];>
unde id_v1,id_v1,…id_vn sunt indentificatori de variabile de orice tip sau de constante
-inchiderea fisierului:
id_f.close();

Un fisier text poate fi creat din mediul de programare file-&amp;gt;New,salvat cu extensia dorita(exemplu:date.in) si folosit („citit”) in program.

Exemplu:
Din fisierul date.in(creat in directorul curent),se citesc variabilele reale a,b si c,separate prin cate un spatiu.
In fisierul date.out se vor afisa valorile citite, pe prima linie,cu cate un spatiu intre ele,iar pe urmatoarele linii,suma si produsul lor.
date in
3 4 5
date out
3 4 5
12
60

*Limbajul pascal:
var f, g: text;
a,b,c,s,p:real;
begin
assign(f,’date.in’);reset(f);
assign(g,’date.out’):rewrite(g);
read(f,a,b,c);
s: =a+b+c; prod: =a*b*c;
writeln(g,a,”,b,”,c);writeln(g,’Suma=’,s);
writeln(g,’Produsul=’,p);
close(f);close(g);
end.
*Limbajul C++:
#include
ifstream f(„date.in”);
ofstream g(„date.out”);
void main()
{float a,b,c,s,p;
f>>a>>b>>c;
s=a+b+c;
p=a*b*c;
<endl;>g<<a<<” „<<b<<” „<<c<<endl;
g<<„suma=”<<s<<endl;
g<<„produsul=”<<p<<endl;
f.close();
g.close();
}

probleme rezolvate:

 

1) Se citeste un fisier TEST ce contine numere intregi despartite prin spatiu sau ENTER. Sa se afiseze minimul si maximul din acel fisier.

#include <iostream>

using namespace std;

#include<fstream.h>

#include<values.h>

 

void main()

{

ifstream f(„C:\\test.txt”);

 

            /*

            ifstream f;

            f.open(„numar.txt”);

            */

 

if(!f) //sau f=NULL

            {

cout<<„Eroare la deschiderea fisierului!”<<endl;

return;

            }

int x,max=-MAXINT,min=MAXINT;

 

f.seekg(0,ios::beg); //ne pozitionam la inceputul fisierului

while(!f.eof())

            {

f>>x;

if (max<x)

max=x;

else if (min>x)

min=x;

            }

 

f.close();

cout<<„Maximul este: „<<max<<endl;

cout<<„Minimul este: „<<min<<endl;

 

int k;

cin>>k;

}

 

2) Se citeste un fisier text ce contine numere intregi despartite prin spatiu sau ENTER. Se cere a se calcula si afisa pe ecran suma tuturor valorilor numerice din fisier si numarul de elemente strict negative.

#include<iostream.h>

using namespace std;

#include<fstream.h>

#include<values.h>

 

void main()

{

ifstream f(„C:\\test.txt”); //sau: fstream f(„C:\\test.txt”,ios::in);

if(!f) //sau f=NULL

            {

cout<<„Eroare la deschiderea fisierului!”<<endl;

return;

            }

 

int x[100], n_neg=0, s=0, i;

f.seekg(0,ios::beg); //ne pozitionam la inceputul fisierului

i=0;

while(!f.eof())

            {

f>>x[i];

if(x[i]<0)

n_neg++;

s+=x[i++];

            }

 

f.close();

cout<<„Numarul elementelor negative: „<<n_neg<<endl;

cout<<„Suma tuturor elementelor: „<<s<<endl;

int k;

cin>>k;

 

}

 

3) Se citeste un fisier TEXT ce contine numere intregi despartite prin spatiu sau ENTER. Sa se afiseze minimul si maximul din acel fisier. Se va defini o clasa ptr numerele intregi din fisier.

#include<iostream.h>

using namespace std;

#include<fstream.h>

#include<values.h>

 

class numar

{

int n;

public:

int& retur();

friend istream& operator>>(istream&,numar&);

};

int& numar::retur()

{

return n;

}

istream& operator>>(istream& a,numar& b)

{

a>>b.n;

return a;

}

void main()

{

ifstream f(„C:\\test.txt „);

if(!f)

            {

cout<<„Eroare la deschiderea fisierului!”<<endl;

return;

            }

 

numar x;

int max=-MAXINT;

int min=MAXINT;

f.seekg(0,ios::beg);

while(!f.eof())

            {

f>>x;

if (max<x.retur())

max=x.retur();

else if (min>x.retur())

min=x.retur();

            }

 

cout<<„Minimul este: „<<min<<endl;

cout<<„Maximul este: „<<max<<endl;

 

int k;

cin>>k;

}

 

4) Se citeste un sir de la tastatura pana la intalnirea caracterului „$”. Dupa citire datele se scriu intr-un fisier text si se preiau din fisierul respectiv si se face contorizarea fiecarei vocale din fisier.

#include<iostream.h>

#include<fstream.h>

#include<stdio.h>

using namespace std;

void main()

{

char c;

int a=0,e=0,i=0,o=0,u=0;

ofstream f(„C:\\test.txt”);

 

if(!f)

            {

cout<<„Eroare la deschidere.”<<endl;

            }

 

do{

c=getchar();

switch(c)

                        {

case ‘a’: a++; break;

case ‘e’: e++; break;

case ‘i’: i++; break;

case ‘o’: o++; break;

case ‘u’: u++;

                        }

 

if(c!=‘$’)

f.put(c); //ar fi mers si f<<c;

            }while(c!=‘$’);

 

f.close();

ofstream g(„C:\\test.txt”);

if(!g)

            {

cout<<„Eroare la deschidere fisierului de citire.”<<endl;

            }

 

g<<„Vocala a se gaseste de : „<<a<<” ori.\n”;

g<<„Vocala e se gaseste de : „<<e<<” ori.\n”;

g<<„Vocala i se gaseste de : „<<i<<” ori.\n”;

g<<„Vocala o se gaseste de : „<<o<<” ori.\n”;

g<<„Vocala u se gaseste de : „<<u<<” ori.\n”;

g.close();

cout<<„Opratia de contorizare a vocalelor a reusit!”<<endl;

 

int k;

cin>>k;

 

}

 

5) Sa se sumeze valorile numerice dintr-un fisier text.

#include<iostream.h>

#include<string.h>

#include<stdlib.h>

#include<fstream.h>

#include<stdio.h>

using namespace std;

 

void main()

{

char a[255], separator[]=” ,”,cifre[]=„0123456789.+-„,*p;

double s=0;

fstream f(„C:\\test.txt”,ios::in);

 

if(!f)

            {

cout<<„Eoare la deschiderea fisierului.”<<endl;

return;

            }

 

while(!f.eof())

            {

f.getline(a,255,‘\n’);

p=strtok(a,separator); //se separa sirul folosind ca separator spatiul sau virgula

while (p)

                        {

if (strspn(p,cifre)==strlen(p))

s+=atof(p);

cout<<p<<„\n”;

p=strtok(NULL,separator);

                        }

            }

 

cout<<„Suma este: „<<s<<endl;

int k;

cin>>k;

}

 

Probleme propuse :

 

1.ÎN FIŞIERUL NUMERE.TXT SUNT MEMORATE PE MAI MULTE LINII, NUMERE ÎNTREGI (CEL MULT 100),NUMERELE DE PE ACEEAŞI LINIE FIIND DESPĂRŢITE PRIN CÂTE UN SPAŢIU, FIECARE NUMĂR AVÂND CELMULT 9 CIFRE. SĂ SE DETERMINE CELE MAI MICI DOUĂ VALORI DISTINCTE, FIECARE AVÂND EXACT DOUĂCIFRE, MEMORATE ÎN FIŞIER ŞI SĂ SE AFIŞEZE PE ECRAN ACESTE VALORI, DESPĂRŢITE PRINTR-UN SPAŢIU.DACĂ ÎN FIŞIER NU SE AFLĂ DOUĂ ASTFEL DE VALORI, PE ECRAN SE VA AFIŞA VALOAREA 0EXEMPLU: DACĂ FIŞIERUL NR1.TXTARE CONŢINUTUL ALĂTURAT,
5 10
3 -77 20
50 5 0 12 18 30
SE VA AFIŞA PE ECRAN, NU NEAPĂRAT ÎN ACEASTĂ ORDINE:-77 10

 

Se dau fisierele i1.txt si i2.txt care contin mai multe caractere.Determinati: a)daca cele doua fisiere au acelasi numar de caractere

b)daca au acelasi caractere

 

2.FIŞIERUL TEXT NUMERE.IN CONŢINE PE PRIMA LINIE UN NUMĂR NATURAL NENUL N (1≤N≤100) ŞI PE URMĂTOAREA LINIE N NUMERE REALE POZITIVE ORDONATE CRESCĂTOR, SEPARATE PRIN CÂTE UN SPAŢIU.A) SCRIEŢI UN PROGRAM C/C++ CARE CITEŞTE DIN FIŞIERUL NUMERE.IN NUMĂRUL NATURAL N, ŞI DETERMINĂ, UTILIZÂND UN ALGORITM EFICIENT DIN PUNCT DE VEDERE AL TIMPULUI DE EXECUTARE ŞI AL MEMORIEI UTILIZATE, NUMĂRUL MINIM DE INTERVALE ÎNCHISE DE FORMA [X,X+1], CU X NUMĂR NATURAL, A CĂROR REUNIUNE INCLUDE TOATE NUMERELE REALE DIN FIŞIER.

EXEMPLU: DACĂ FIŞIERUL NUMERE.IN ARE CONŢINUTUL:

2.3 2.3 2.8 5.7 5.7 6.3

ATUNCI SE AFIŞEAZĂ 3 (INTERVALELE [2,3], [5,6], [6,7] SUNT CELE 3 INTERVALE DE FORMA CERUTĂ CARE CONŢIN NUMERE DIN ŞIR).

 

3.Se dau fisierele i1.txt si i2.txt care contin mai multe caractere.Determinati: a)daca cele doua fisiere au acelasi numar de caractere

b)daca au acelasi caractere

 #include<iostream.h>

#include<fstream.h>

void main()

{char c,d;

ifstream f1(„i1.txt”);

ifstream f2(„i2.txt”);

while(!f1.eof() && !f2.eof() )

{f1.get(c);

f2.get(d);

}

if(f1.eof() && f2.eof() )

cout<<„au acelasi numar de caractere”;

else

cout<<„Diferite”;

if(!f1.eof() )

cout<<„I1 are mai multe caractere”;

else

cout <<„I2 are mai multe caractere”;

cin>>c>>d;

}