purdelvasile.files.wordpress.com€¦  · web viewf i s i e r e. datele de intrare (de prelucrat),...

19
F I S I E R E Datele de intrare(de prelucrat), pana acum le-am introdus de la tastatura, iar datele de iesire pana acum le-am afisat pe monitor. Avem posibilitatea ca datele intrare sa le luam din fisiere, iar datele de iesire sa le memoram in fisiere. Fisierul din care citim datele se numeste fisier de INTRARE, iar fisierul in care memoram datele prelucrate se numeste fisier de IESIRE. Citirea si scrierea se face cu ajutorul unor streamuri. Avem urmatoarele tipuri de streamuri: 1. Stream standard 2. Streamuri care folosesc fisiere 3. Streamuri care folosesc memoria Streamul este un flux de date dintre doua componente ale calculatorului, care este realizat printr-o functie speciala. 1. Stream standard a. Streamul standard de INTRARE 1

Upload: others

Post on 01-Sep-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

F I S I E R E

Datele de intrare(de prelucrat), pana acum le-am introdus de la tastatura, iar datele de iesire pana acum le-am afisat pe monitor. Avem posibilitatea ca datele intrare sa le luam din fisiere, iar datele de iesire sa le memoram in fisiere. Fisierul din care citim datele se numeste fisier de INTRARE, iar fisierul in care memoram

datele prelucrate se numeste fisier de IESIRE.

Citirea si scrierea se face cu ajutorul unor streamuri. Avem urmatoarele tipuri de streamuri:

1. Stream standard2. Streamuri care folosesc fisiere3. Streamuri care folosesc memoria

Streamul este un flux de date dintre doua componente ale calculatorului, care este realizat printr-o functie speciala.

1. Stream standarda. Streamul standard de INTRARE

TASTATURAcin

MEMORIA RAM

1

Page 2: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

Streamul standard de intrare este realizat cu functia cin, care dirijeaza date de la TASTATURA la variabilele din RAM.

b. Streamul standard de IESIRE

MONITORcout

MEMORIA RAM

Streamul standard de iesire este realizat cu functia cout, care dirijeaza date de la variabilele din RAM la MONITOR.

Functia cin mai poarta denumirea de functie de INTRARE, iar functia cout mai poarta denumirea de functia de IESIRE. Cele doua functii se afla in biblioteca <iostream.h>

Pentru inceput lucram cu fisiere, care contin numere. In fisier, aceste numere sunt separate de spatiu si sfarsit de linie.

date.txt

1 2 11 222 3 <EOL>321 55 6<EOL>4 5 6 7 9 111 22<EOL>5<EOL>77<EOL>34<EOL><EOF>Numerele sunt separate pe aceeasi linie prin unul sau mai multe spatii. <EOL>=codul ASCII a unui character, ce indica sfarsitul liniei dintr-un fisier(End Of Line). Daca am citit ultimul numar de pe o linie, urmatorul numar de citit este primul de pe linia urmatoare.

2

Page 3: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

Streamurile pentru fisiere sunt si ele de doua feluri: stream de intrare fisier si stream de iesire fisier. Functiile care lucreaza cu streamurile fisier sunt ifstream, ofstream si close, care se gasesc in biblioteca <fstream.h>.

UTILIZAREA FISIERELOR IN CITIRE

Pentru a prelua date dintr-un fisier de pe HARD, el trebuie sa existe. Il creem din CODE BLOCKS astfel:

1. FILE NEW EMPTY

3

Page 4: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

2. Actionam Yes pentru a crea acest fisier ce este folosit de proiectul in curs

3. Actionam Yes+alegem All files si actionam Save

4

Page 5: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

4. Dam denumirea “date.txt” fisierului si-l salvam

5. Apare o fereastra cu obtiunile Debug si Release, care trebuie sa fie activate, apoi actionam OK

5

Page 6: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

6. Putem introduce date

7. In final actionam butonul de inchidere de la date.txt si-l salvam

Ca sa lucram cu-n fisier in citire intr-un program C++, trebuie sa parcurgem urmatoarele etape:

1. Deschidem fisierul in citire2. Citim datele din fisier si le prelucram3. Inchidem fisierul

1. DESCHIDERE FISIER – In acest caz se rezerva o zona de memorie, denumita BUFFER, unde sunt incarcate date din fisier pentru citire. Presupunem ca in BUFFER incape continutul la tot fisierul.

Deschiderea se face cu functia IFSTREM (Input File STREAM), astfel:

Ifstream nume_logic_fisier(“nume_fizic_fisier”);

Prin aceasta functie se realizeaza urmatoarele lucruri:

6

Page 7: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

a) Se rezerva BUFFER pentru date.txtb) Continutul lui date.txt e incarcat in BUFFERc) Numelui fizic I se asociaza un nume logic, cu ajutorul caruia facem citirea

din fisier

Numele logic al unui fisier se formeaza ca si numele unei variabile, iar numele fizic este numele pe care il are pe hard(date.txt).

Problema: Sa se tipareasca pe ecran, unele sub altele, primele 6 numere din fisier.

#include <iostream>#include <fstream> //contine functiile: ifstream(), ofstream() si close()

using namespace std;int main(){ int x; ifstream fin(“date.txt”); for(int i=1;i<=6;i++)

{fin>>x;cout<<x<<endl;} fin.close(); return 0;}

7

Page 8: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

buffer

date.txt1 2 11 222 3 321 55 6 4 5 6 7 9 111 22 5 77

1 2 11 222 3 321 55 6 4 5 6 7 9 111 22 5 77 34

HARD DISC MEMORIA RAM

ifstrem fin(“date.txt”)

Ce se intampla la ifstrem fin(“date.txt”)?

fin>>x neglijeaza spatiile, formeaza numarul din toate cifrele consecutive, il memoreaza in variabila x si se opreste la primul spatiu pe care-l intalneste.

f.close() dezaloca zona de memorie BUFFER, care poate fi folosita de alte programe in continuareIn urma executiei programului se va afisa pe monitor:12112223321

8

Page 9: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

Ca sa lucram (sa-l cream) cu-n fisier in scriere intr-un program C++, trebuie sa parcurgem urmatoarele etape:

1. Deschidem fisierul in scriere2. Prelucram datele si apoi le scriem in fisier3. Inchidem fisierul

1. DESCHIDERE FISIER – In acest caz se rezerva o zona de memorie, denumita BUFFER, unde urmeaza sa scriem datele ce trebuie sa le contina.

Deschiderea se face cu functia OFSTREM (Output File STREAM), astfel:

ofstream nume_logic_fisier(“nume_fizic_fisier”);

Prin aceasta functie se realizeaza urmatoarele lucruri:

d) Se rezerva BUFFER pentru un fisier numere.txte) In numere.txt, sunt scrise datef) Numelui fizic i se asociaza un nume logic, cu ajutorul caruia facem scrierea

in fisier

Numele logic al unui fisier se formeaza ca si numele unei variabile, iar numele fizic este numele pe care il are pe hard(numere.txt).

Problema: Sa se scrie intr-un fisier pe prima linie numerele 11,22 si 33 separate prin cate un spatiu, iar pe urmatoarele 5 linii se vor scrie unele sub altele primele 5 numere naturale.

9

Page 10: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

buffer

numere.txt

11 22 3312345

HARD DISC MEMORIA RAM

11 22 3312345

#include <iostream>#include <fstream> //contine functiile: ifstream(), ofstream() si close()

using namespace std;int main(){ int x; ofstream fout(“numere.txt”);fout<<11<<’ ‘<<22<<’ ‘<<33<<endl;for(x=1;x<=5;x++) fout<<x<<endl; fout.close(); return 0;}

Ce se intampla la ofstremm fout(“numere.txt”)?

10

Ofstream fout(“numere.txt”)

Page 11: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

fout<<11<<’ ‘<<22<<’ ‘<<33<<endl; scrie pe prima linie din fisier 11 22 33, apoi sare la urmatoarea linie.for(x=1;x<=5;x++) fout<<x<<endl;Prin secventa de mai sus se scriu in fisier primele 5 numere natural, unele sub altele( pe linii diferite)f.close() salveaza datele pe disc in fisierul numere.txt, apoi dezaloca zona de memorie( BUFFERUL), care poate fi folosit de alte programe in continuare

Ca sa verificam, trebuie sa deschidem fisierul numere.txt, ori in code blocks, ori din exteriorul platformei code blocks, utilizand NOTEPAD sau WORDPAD.

PROBLEME1. Pe prima linie a unui fisier in.txt se afla un numar natural de cel mult 4

cifre(tipul int), iar pe a doua linie se afla n numere naturale de cel mult 4 cifre separate prin unul sau mai multe spatii. Sa se afle suma celor n numere, maximul dintre ele si minimul dintre ele, apoi sa se scrie acestea intr-un fisier out.txt , unele sub altele in ordinea: maxim, suma, minim.

#include <iostream.h>#include <fstream.h>

using namespace std;

int main(){

int maxim, minim, suma,n,x;ifstream fi(“in.txt”);ofstream fo(“out.txt”);fi>>n;fi>>x;maxim=minim=suma=x;for(int i=2;i<=n;i++){

fi>>x;suma=suma+x; if(maxim<x) maxim=x;

11

Page 12: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

if(minim>x) minim=x;}fo<<maxim<<endl;fo<<suma<<endl;fo<<minim;fi.close(); fo.close();return 0;

}

2. Pe prima linie a unui fisier in.txt se afla un numar natural de cel mult 4 cifre(tipul int), iar pe a doua linie se afla n numere naturale de cel mult 4 cifre separate prin unul sau mai multe spatii. Sa se afle cate sunt pare si cate sunt impare. Sa se scrie intr-un fisier out.txt, unele sub altele, astfel incat pe prima linie sa apara numarul cifrelor pare.

3. Fişierul text bac.txt conţine, pe prima linie un numar natural p,iar pe linia urmatoare, p numere naturale nenule cu cel mult 4 cifre fiecare, numerele fiind separate prin câte un spaţiu. Scrieţi un program C++ care citeşte de la tastatură un număr natural nenul n (n≤999) şi numerele din fişierul bac.txt şi care afişează pe ecran, separate prin câte un spaţiu, toate numerele din fişier care sunt divizibile cu n. Dacă fişierul nu conţine niciun astfel de număr, atunci se va afişa pe ecran mesajul NU EXISTA. Exemplu: dacă fişierul bac.txt conţine numerele: 93 100 40 70 25 5 80 6 3798, pentru n=10 atunci pe ecran se va afişa: 100 40 70 80

Observatie: daca numarul are cel mult 4 cifre atunci se poate reprezenta cu tipul de data INT, iar daca are cel mult 8 cifre, atunci se va reprezenta cu tipul de data LONG

#include <iostream.h>#include <fstream.h>

using namespace std;

int main(){

12

Page 13: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

int n,x,p;int ok=0; //daca ok ramane cu valoarea 0 inseamna ca n-am avut niciun // numar din fisier care sa se divida la nifstream fi(“in.txt”);fi>>p;cout<<”n=”;cin>>n; for(int i=1;i<=p;i++){

fi>>x; if(x%n==0)

{cout<<x<<’ ‘;ok=1;

}} If(ok==0) cout<<” NU EXISTA”;fi.close(); return 0;

}

4. Scrieţi un program C++ care citeşte de la tastatură un număr natural n cu cel mult 8 cifre (n≥10) şi care creează fişierul text NR.TXT 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 NR.TXT va conţine numerele: 10305 1030 103 10 1

5. Scrieţi un program C++ care citeşte de la tastatură un număr natural n (n≤50) şi care afişează pe prima linie a fişierului BAC.TXT primele n numere pare, pe a doua linie primele n-1 numere pare, ..., pe linia n primul număr par. Numerele vor fi afişate pe fiecare linie în ordine crescătoare şi vor fi separate prin câte un spaţiu. Exemplu: dacă n=4 fişierul BAC.TXT va avea conţinutul alăturat. 0 2 4 6 0 2 4 0 2 0

13

Page 14: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

Daca intr-un fisier se afla mai multe numere separate prin spatii, sau prin caracterul sfarsit de linie, cum facem sa citim toate numerele.Citirea se face atata timp cat nu am ajuns la caracterul <EOF>(End Of File), care indica sfarsitul de fisier.

int x; //in x se citesc datele din fisier ifstream fin(“in.txt”); fin numele logic asociat fisierului in.txt

while(fin>>x)//daca nu s-a ajuns pe <EOF> se citeste numarul in x{prelucrare}fin.close(); Presupunem ca avem fisierul in.txt, ce are urmatorul continut”

22 33<EOL>1 2<EOL>99 777<EOF>

while(fin>>x)cout<<x<<endl;

La inceput cursorul e pozitionat pe primul character.I. Nu este pozitionat cursorul pe <EOF> citeste in x pe 22, il tipareste

pe monitor si sare la linie noua, dupa care cursorul se pozitioneaza pe primul spatiu dupa 2.

22_ 33<EOL> 11<EOL> 99 777<EOF>

II. Nu este pozitionat cursorul pe <EOF> citeste in x pe 33, il tipareste pe monitor si sare la linie noua, dupa care cursorul se pozitioneaza pe <EOL>

14

Page 15: purdelvasile.files.wordpress.com€¦  · Web viewF I S I E R E. Datele de intrare (de prelucrat), pana acum le-am introdus de la . tastatura, iar . datele de iesire. pana acum le-am

22 33<EOL> 11<EOL> 99 777<EOF>

III. Nu este pozitionat cursorul pe <EOF> citeste in x pe 11, il tipareste pe monitor si sare la linie noua, dupa care cursorul se pozitioneaza pe <EOL>

22 33<EOL> 11<EOL> 99 777<EOF>

IV. Nu este pozitionat cursorul pe <EOF> citeste in x pe 99, il tipareste pe monitor si sare la linie noua, dupa care cursorul se pozitioneaza pe primul spatiu dupa 9

22 33<EOL> 11<EOL> 99_ 777<EOF>

V. Nu este pozitionat cursorul pe <EOF> citeste in x pe 777, il tipareste pe monitor si sare la linie noua, dupa care cursorul se pozitioneaza pe <EOF>

22 33<EOL> 11<EOL> 99 777<EOF>

VI. Cursorul fiind pozitionat pe <EOF> s-a terminat citirea din fisier si se sare la a doua instructiune dupa while

6. Pe prima linie a unui fisier in.txt se afla mai multe numere de cel mult 4 cifre(tipul int) separate prin unul sau mai multe spatii. Sa se afle suma lor, maximul dintre ele si minimul dintre ele, apoi sa se scrie acestea intr-un fisier out.txt , unele sub altele in ordinea: maxim, suma, minim.

Mai gasiti probleme in fisierul 2009_variante_informatica la punctul III.3

15