|
|
Uneori, anumite probleme impun citirea datelor de intrare dintr-un fisier in loc de a fi citite de la tastatura, respectiv scrierea intr-un fisier in locul afisarii rezultatelor direct pe ecran. Spre deosebire de cazul in care datele rezultate dintr-un program sunt afisate pe ecran, redirectionarea acestora catre un fisier aduce avantajul ca aceste rezultate pot fi salvate si stocate in vederea unor consultari ulterioare.
Pentru a putea accesa lucrul cu fisiere intr-un program este nevoie sa avem declarata directiva fstream: :
#include <fstream>
In lucrul cu fisiere se pot efectua urmatoarele operatii:
- Deschiderea fisierelor
Pentru a putea opera intr-un fisier, acesta trebuie deschis. Deschiderea unui fisier se face astfel:
- Pentru citire - valorile stocate in fisier vor fi citite in vederea prelucrarii:
ifstream <alias_fisier>("<nume_fisier>");
sau
fstream <alias_fisier>("<nume_fisier>",ios::in);
unde:
- alias_fisier - reprezinta numele cu care este recunoscut fisierul in cadrul programului
- nume_fisier - reprezinta numele fizic al fisierului pe disc
- ifstream - reprezinta streamul de intrare
- fstream - reprezinta streamul general - poate fi utilizat atat pentru citirea cat si pentru scrierea din/in fisier
Exemplu:
ifstream f>("test.txt");
fstream f>("test.txt",ios::in);
- Pentru scriere - valorile rezultate in urma prelucrarii vor fi scrise in fisier:
ofstream <alias_fisier>("<nume_fisier>");
sau
fstream <alias_fisier>("<nume_fisier>",ios::out);
unde:
- alias_fisier - reprezinta numele cu care este recunoscut fisierul in cadrul programului
- nume_fisier - reprezinta numele fizic al fisierului pe disc
- ifstream - reprezinta streamul de intrare
- fstream - reprezinta streamul general - poate fi utilizat atat pentru citirea cat si pentru scrierea din/in fisier
Exemplu:
ofstream f>("testare.txt");
fstream f>("test.txt",ios::out);
- Inchiderea fisierelor
Dupa terminarea operatiilor de intrare/iesire cu fisierele utilizare, acestea trebuiesc inchise, inainte de iesirea din program. Acest lucru se realizeaza astfel:
<alias_fisier>.close();
unde:
- alias_fisier - reprezinta numele cu care este recunoscut fisierul in cadrul programului
- close - functia cu care se inchide fisierul
Exemplu:
f.close();
- Citirea datelor din fisiere se realizeaza astfel:
<alias_fisier> >> <nume_var>;
unde:
- alias_fisier - reprezinta numele cu care este recunoscut fisierul in cadrul programului
- nume_var - numele variabilei in care urmeaza a se stoca valoarea citita din fisier
Exemplu:
f>>a;
f>>a[i];
- Scrierea datelor in fisiere se realizeaza astfel:
<alias_fisier> << <nume_var>;
unde:
- alias_fisier - reprezinta numele cu care este recunoscut fisierul in cadrul programului
- nume_var - numele variabilei in care urmeaza a se stoca valoarea citita din fisier
Exemplu:
f<<a;
f<<a[i];
Problema: Sa se citeasca si sa se insumeze toate numerele dintr-un fisier numit test.txt si sa se afiseze sumele intermediare intr-un fisier numit testare.txt. (Se va crea initial fisierul test.txt care va cuprinde numerele 1 3 5 7 4 6 8 9)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,s=0;
ifstream f("test.txt");
ofstream g("testare.txt");
while (!f.eof())
{
f>>a;
s=s+a;
cout<<s<<" ";
g<<s<<" ";
}
f.close();
g.close();
return 0;
}
|
|
|
1 4 9 16 20 26 34 42
|
1. |
Sa se calculeze suma a 2 numere naturale care se citesc dintr-un fisier a.txt. Sa se calculeze suma celor 2 numere si sa se scrie in fisierul b.txt. |
Solutie |
2. |
Sa se interschimbe valorile a 2 numere citite din fisierul a.txt. Valorile de dupa schimbare vor fi rescrise in acelasi fisier. |
Solutie |
3. |
Dintr-un fisier numere.in se citesc 2 numere naturale a si b. Sa se calculeze suma dintre a si b daca a<b si diferenta dintre a si b daca a>b. Rezultatul se va scrie intr-un fisier numere.out. |
Solutie |
4. |
Din fieirul note.txt se citesc cele 4 note obtinute de un elev la informatica pe parcursul unui semestru si nota de la teza. Scrieti un algoritm care sa afiseze media lui si sa o scrie intr-un fisier numit media.txt. |
Solutie |
5. |
Dintr-un fisier numere.in se citesc 2 numere a si b. Sa se determine ultimele doua cifre ale produsului a*b - acestea vor fi scrise intr-un fisier numere.out. |
Solutie |
6. |
Sa se verifice daca 3 numere a,b,c - citite din fisierul pitagora.in - sunt pitagorice (patratul unuia poate fi scris ca suma patratelor celorlalte doua). Numerele, respectiv rezultatul testului vor fi scrise in fisierul pitagora.out. |
Solutie |
7. |
Fisierul segmente.txt contine - pe cate un rand - perechi de numere reprezentand coordonatele extremitatilor a doua segmente. Sa se afiseze lungimea segmentului mai mare si sa se scrie in fisierul rezultat.txt.
Exemplu: Segmentul AB va avea coordonatele lui A: A(2,2) si B: B(5,6). Segmentul CD va avea coordonatele lui C: C(3,2) si D: D(9,10). In fisierul segmente.txt vom avea:
2 2
5 6
3 2
9 10
Rezultatul afisat pe ecran si introdus in fisierul rezultat.txt va fi: 10.
|
Solutie |
8. |
Sa se introduca de la tastatura un numar n si sa se specifice daca acesta apartine intervalului [a,b], unde a si b sunt citite din fisierul numere.in iar rezultatul va fi scris in fisierul numere.out. |
Solutie |
9. |
Dintr-un fisier intrare.txt se va citi un numar natural n. Sa se scrie, pe linii separate, in fisierul iesire.txt:
- cate cifre are numarul citit
- suma cifrelor numarului citit
- cea mai mare cifra a numarului citit
- de cate ori se gaseste o cifra (citita de la tastatura) in numarul citit.
|
Solutie |
10. |
Sa se scrie in fisierul Factorial.txt, pe 2 coloane, primele n cupluri (n n!):
1 1
2 2
3 6
4 24
....
n n!
|
Solutie |
Rezolvari
1. |
Sa se calculeze suma a 2 numere naturale care se citesc dintr-un fisier a.txt. Sa se calculeze suma celor 2 numere si sa se scrie in fisierul b.txt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,b,s;
ifstream f("a.txt");
ofstream g("b.txt");
f>>a;
cout<<"a="<<a<<endl;
f>>b;
cout<<"b="<<b<<endl;
s=a+b;
cout<<"Suma celor 2 numere este: "<<s;
g<<s;
f.close();
g.close();
return 0;
}
|
|
2. |
Sa se interschimbe valorile a 2 numere citite din fisierul a.txt. Valorile de dupa schimbare vor fi rescrise in acelasi fisier.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,b,temp;
ifstream f("a.txt");
f>>a;
cout<<"a="<<a<<endl;
f>>b;
cout<<"b="<<b<<endl;
temp=a;
a=b;
b=temp;
f.close();
cout<<"Dupa interschimbare: "<<endl<<"a="<<a<<endl<<"b="<<b;
ofstream g("a.txt");
g<<a<<" "<<b;
g.close();
return 0;
}
|
|
3. |
Dintr-un fisier numere.in se citesc 2 numere naturale a si b. Sa se calculeze suma dintre a si b daca a<b si diferenta dintre a si b daca a>b. Rezultatul se va scrie intr-un fisier numere.out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,b,s,d;
ifstream f("numere.in");
ofstream g("numere.out");
f>>a;
cout<<"a="<<a<<endl;
f>>b;
cout<<"b="<<b<<endl;
if (a<b)
{
s=a+b;
cout<<"s="<<s;
g<<s<<endl;
}
else
{
d=a-b;
cout<<"d="<<d;
g<<d<<endl;
}
f.close();
g.close();
return 0;
}
|
|
4. |
Din fieirul note.txt se citesc cele 4 note obtinute de un elev la informatica pe parcursul unui semestru si nota de la teza. Scrieti un algoritm care sa afiseze media lui si sa o scrie intr-un fisier numit media.txt.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n1,n2,n3,n4,t;
float mo,mf;
ifstream f("note.txt");
ofstream g("media.txt");
f>>n1;
cout<<"Nota 1: "<<n1<<endl;
f>>n2;
cout<<"Nota 2: "<<n2<<endl;
f>>n3;
cout<<"Nota 3: "<<n3<<endl;
f>>n4;
cout<<"Nota 4: "<<n4<<endl;
mo=(float)(n1+n2+n3+n4)/4;
f>>t;
cout<<"Nota la teza: "<<t<<endl;
cout<<"Media notelor este: "<<mo<<endl;
mf=(mo*3+t)/4;
cout<<"Media finala este: "<<mf<<endl;
g<<"Media finala este: "<<mf<<endl;
f.close();
f.close();
return 0;
}
|
|
5. |
Dintr-un fisier numere.in se citesc 2 numere a si b. Sa se determine ultimele doua cifre ale produsului a*b - acestea vor fi scrise intr-un fisier numere.out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,b,p1,p2,r1,r2;
ifstream f("numere.in");
ofstream g("numere.out");
f>>a;
f>>b;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
p1=a*b;
cout<<"Produsul intre "<<a<<" si "<<b<<" este: "<<p1<<endl;
r1=p1%10;
cout<<"Ultima cifra a produsului este: "<<r1<<endl;
p2=p1/10;
r2=p2%10;
cout<<"Penultima cifra a produsului este: "<<r2<<endl;
g<<"Produsul intre "<<a<<" si "<<b<<" este: "<<p1<<endl;
g<<"Ultima cifra a produsului este: "<<r1<<endl;
g<<"Penultima cifra a produsului este: "<<r2<<endl;
f.close();
g.close();
return 0;
}
|
|
6. |
Sa se verifice daca 3 numere a,b,c - citite din fisierul pitagora.in - sunt pitagorice (patratul unuia poate fi scris ca suma patratelor celorlalte doua). Numerele, respectiv rezultatul testului vor fi scrise in fisierul pitagora.out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int a,b,c;
ifstream f("pitagora.in");
ofstream g("pitagora.out");
f>>a;
f>>b;
f>>c;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
if ((a*a+b*b==c*c) || (a*a+c*c==b*b) || (b*b+c*c==a*a))
g<<"Cele 3 numere: "<<a<<", "<<b<<", "<<c<<" sunt pitagorice "<<endl;
else
g<<"Cele 3 numere: "<<a<<", "<<b<<", "<<c<<" sunt pitagorice "<<endl;
f.close();
g.close();
return 0;
}
|
|
7. |
Fisierul segmente.txt contine - pe cate un rand - perechi de numere reprezentand coordonatele extremitatilor a doua segmente. Sa se afiseze lungimea segmentului mai mare si sa se scrie in fisierul rezultat.txt.
Exemplu: Segmentul AB va avea coordonatele lui A: A(2,2) si B: B(5,6). Segmentul CD va avea coordonatele lui C: C(3,2) si D: D(9,10). In fisierul segmente.txt vom avea:
2 2
5 6
3 2
9 10
Rezultatul afisat pe ecran si introdus in fisierul rezultat.txt va fi: 10.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28
|
#include <iostream>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
float x,x1, y1, x2,y2,x3,y3,x4,y4,l1,l2;
ifstream f("segmente.txt");
ofstream g("rezultat.txt");
f>>x1>>y1;
f>>x2>>y2;
cout<<"Coordonatele primului segment: ("<<x1<<","<<y1<<"), ("<<x2<<","<<y2<<")"<<endl;
f>>x3>>y3;
f>>x4>>y4;
cout<<"Coordonatele celui de-al doilea segment: ("<<x3<<","<<y3<<"), ("<<x4<<","<<y4<<")"<<endl;
l1=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
l2=sqrt(pow((x3-x4),2)+pow((y3-y4),2));
if (l1==l2)
g<<"Lungimile celor doua segmente sunt egale "<<endl;
else
if (l1>l2)
g<<"Lungimea mai mare este l1="<<l1<<endl;
else
g<<"Lungimea mai mare este l2="<<l2<<endl;
f.close();
g.close();
return 0;
}
|
|
8. |
Sa se introduca de la tastatura un numar n si sa se specifice daca acesta apartine intervalului [a,b], unde a si b sunt citite din fisierul numere.in iar rezultatul va fi scris in fisierul numere.out.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,a,b;
ifstream f("numere.in");
ofstream g("numere.out");
cout<<"Introduceti numarul n:";
cin>>n;
f>>a>>b;
cout<<"Intervalul este: ["<<a<<","<<b<<"]";
if (n>=a && n<=b)
g<<"Numarul "<<n<<" este cuprins in intervalul ["<<a<<","<<b<<"]"<<endl;
else
g<<"Numarul "<<n<<" nu este cuprins in intervalul ["<<a<<","<<b<<"]"<<endl;
f.close();
g.close();
return 0;
}
|
|
9. |
Dintr-un fisier intrare.txt se va citi un numar natural n. Sa se scrie, pe linii separate, in fisierul iesire.txt:
- cate cifre are numarul citit
- suma cifrelor numarului citit
- cea mai mare cifra a numarului citit
- de cate ori se gaseste o cifra (citita de la tastatura) in numarul citit.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 31 32
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,m,i=0,j=0,r,s=0,max=0,cifra;
ifstream f("intrare.txt");
ofstream g("iesire.txt");
f>>n;
cout<<"n="<<n<<endl;
m=n;
cout<<"Introduceti cifra de cautat in numarul "<<n<<": ";
cin>>cifra;
while (n!=0)
{
r=n%10;
if (r>max)
max=r;
if (r==cifra)
j++;
n=n/10;
s=s+r;
i++;
}
g<<"Numarul "<<m<<" are "<<i<<" cifre!"<<endl;
g<<"Suma cifrelor numarului "<<m<<" este: s="<<s<<endl;
g<<"Cea mai mare cifra a numarului "<<m<<" este: max="<<max<<endl;
g<<"Cifra "<<cifra<<" se gaseste in numarul "<<m<<" de "<<j<<" ori."<<endl;
f.close();
g.close();
return 0;
}
|
|
10. |
Sa se scrie in fisierul Factorial.txt, pe 2 coloane, primele n cupluri (n n!):
1 1
2 2
3 6
4 24
....
n n!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,i,j,fi;
ofstream g("Factorial.txt");
cout<<"Introduceti valoarea lui n: ";
cin>>n;
for (i=1;i<=n;i++)
{
fi=1;
for (j=1;j<=i;j++)
fi=fi*j;
g<<i<<" "<<fi<<endl;
}
g.close();
return 0;
}
|
|
|
|
|
|