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. 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.
 * 1) include
 * 1) include

Soluție: 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.
 * 1) include
 * 2) include

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. 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); if((c>='a') && (c<='z') || (c==' ') || (c>='A') && (c<='Z')) fout<>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) include
 * 2) include

1. 6 

267 13 45 628 7 79 

Fișierul numere.out ar conține:

5 2 3 6 1 4

Soluție: 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>nr[i]; for(i=0;inr[j]) sw++; poz[i]=sw; }    for(i=0;i<n;i++) fout<<poz[i]<<' '; fin.close; fout.close; return 0; }
 * 1) include
 * 2) include