Informatiile acestui spatiu sunt gratuite. Observatii si sugestii pot fi trimise pe adresa de contact sau pe forum.

     Fisiere in C++

Probleme rezolvate

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:

  1. 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);


  2. Inchiderea fisierelor
  3. 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();

  4. Citirea datelor din fisiere se realizeaza astfel:
  5. <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];

  6. Scrierea datelor in fisiere se realizeaza astfel:
  7. <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



















Probleme rezolvate

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;
}