Exercitii rezolvate - fisiere

1. Fişierul text date.in conţine, separate prin spaţii, cel mult 1000000 de numere naturale, fiecare număr având cel mult 3 cifre. Scrieţi un program C++ care afişează pe ecran, separate prin câte un spaţiu, în ordine crescătoare, toate numerele din fişier aflate între două valori date de la tastatură. Dacă fişierul nu conţine astfel de numere se va afişa pe ecran mesajul „NU EXISTA”.

Soluție: pentru a afișa în ordine numerele din fișier nu este necesar să sortăm șirul acestora. Vom utiliza, în schimb, un vector caracteristic pentru a număra valorile din fișier.

```
#include <fstream>

#include <iostream>

using namespace std;

int main()
{
    int f[1000], x, y, aux, i, gasit=0;
   //initializez vectorul de frecventa, f
    for(i=0;i<1000;i++)
         f[i]=0;

   //declar fisierul f si il deschid pentru extragere de date
    ifstream fis("date.in");

   //extrag numerele din fisier si incrementez pozitia corespunzatoare din

   //vectorul de frecventa
    while(fis>>x)
    {
        f[x]++;
    }

    //citesc capetele intervalului
    cout<<"introduceti limitele de cautare !";
    cin>>x>>y;

    //verific daca prima limita e mai mare, caz in care le inversez
    if(x>y)
    {
     aux=x;
     x=y;
     y=aux;
    }

    //caut in f valorile diferite de zero ale caror indecsi au valori intre x si y
    for(i=x;i<=y;i++)
         if(f[i]>0)
         {
         cout<<i<<' ';
         gasit=1;
         }

    if(!gasit) cout<<"NU EXISTA";
    fis.close();
    return 0;}

```

2. Scrieţi un program C++ care citeşte de la tastură un număr natural n cu cel mult 9 cifre şi care creează fişierul text date.out 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 date.out  va conţine numerele: 10305 1030 103 10 1.

Soluție:

```
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    unsigned long n;
    cin>>n;

   //declar fisierul f si il deschid pentru scriere de date
   ofstream fis("date.out");
   while(n!=0)
   {
   //scriem in fiser numarul, apoi eliminam ultima cifra
   fis<<n<<'\n';
   n=n/10;
   }
   fis.close();
   return 0;
}

```

3. Fișierul text.in conține un text format din diferite caractere. Se cere să se creeze fișierul text.out, care să conțină doar cuvintele din text și spațiile dintre ele.

Soluție: utilizarea operatorilor de extracție nu este indicată în această situație, deoarece, în mod implicit, aceștia omit spațiile albe. Vom folosi, de aceea, metoda get().

```
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    char c;
    ifstream fin("text.in");
    ofstream fout("text.out");
    while(!fin.eof())
    {
    //extrag in variabila c un caracter, folosind metoda get pentru a nu omite spatiile albe
    fin.get(c);
                        fout<<c;}
    fin.close();
    fout.close();
    return 0;
}

```

4. Fișierul date.in conține pe prima linie n, un număr întreg, iar pe linia următoare n numere întregi. Se cere să se genereze fișierul date.out care să conțină toate permutările circulare ale șirului dat.

Soluție:

```
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int n,i,x,b[100],j=1,aux;
    ifstream f("date.in");
    ofstream g("date.out");
    f>>n;
    for(i=1;i<=n;i++)
         f>>b[i];
    for(i=1;i<=n;i++)
    {
     aux=b[1];
     for(j=2;j<=n;j++)
     b[j-1]=b[j];
     b[n]=aux;

     for(j=1;j<=n;j++)
          g<<b[j]<<' ';
          g<<endl;
     }
return 0;
}

```

5. În fişierul numere.in pe prima linie este memorat un număr natural n (n≤10000), iar pe linia următoare un şir de n numere naturale distincte două câte două, separate prin câte un spaţiu, cu maximum 4 cifre fiecare. Se cere să se creeze fișierul numere.out care să conțină pentru fiecare dintre cele n numere poziția pe care ar ocupa-o dacă șirul numerelor ar fi sortat crescător. Exemplu: dacă fişierul numere.in conţine:

*1. 6*

*267 13 45 628 7 79*

Fișierul numere.out ar conține:

*5 2 3 6 1 4*

Soluție:

```
#include <fstream>
#include <iostream>
using namespace std;
int main()
{
    int nr[1000], poz[10000],i,j,n,sw;
    ifstream fin("numere.in");
    ofstream fout("numere.out");
    fin>>n;
    for(i=0;i<n;i++)
           fin>>nr[i];
    for(i=0;i<n;i++)
    {
    sw=0;
    for(j=0;j<n;j++)
         if(nr[i]>nr[j]) sw++;
    poz[i]=sw;
    }
    for(i=0;i<n;i++)
         fout<<poz[i]<<' ';
    fin.close();
    fout.close();
return 0;
}

```