10.3. prelucrarea fişierelor la nivel superior
TRANSCRIPT
Programarea calculatoarelor
Universitatea “Constatin Brâncuşi” din Târgu-Jiu Facultatea de Inginerie
Departamentul de Automatică, Energie şi Mediu
Lect.dr. Adrian Runceanu
Curs 14
01.12.2013 Programarea calculatoarelor 2
Capitolul 10. Fişiere
10.1. Declarare. Operaţii cu fişiere
10.2. Prelucrarea fişierelor la nivel inferior
10.3. Prelucrarea fişierelor la nivel superior
10.4. Probleme rezolvate - fișiere prelucrate la nivel superior
01.12.2013 Programarea calculatoarelor 3
10.1. Declarare. Operaţii cu fişiere.
Fişierul este o colecţie de informaţii ordonată în înregistrări.
01.12.2013 Programarea calculatoarelor 4
10.1. Declarare. Operaţii cu fişiere.
Fişierele pot fi de mai multe tipuri, în funcţie de datele ce se memorează în ele:
1. fişier text conţine doar caractere ASCII, iar înregistrările sunt separate prin caracterele speciale CR şi LF
2. fişier standard ( fişierul header ) este un fişier text
3. fişier binar este un fişier ce conţine date în format intern, iar înregistrările nu se mai separă prin caractere speciale
01.12.2013 Programarea calculatoarelor 5
10.1. Declarare. Operaţii cu fişiere.
1. Operaţii cu fişiere
Prezentăm în continuare operaţiile ce se pot efectua cu fişiere în limbajul C:
• deschiderea unui fişier
• crearea unui fişier
• actualizarea unui fişier
• consultarea unui fişier
01.12.2013 Programarea calculatoarelor 6
10.1. Declarare. Operaţii cu fişiere.
• poziţionarea pe o anumită înregistrare din fişier
• ştergerea unui fişier
• ştergerea de înregistrări din fişier
• redenumirea unui fişier
01.12.2013 Programarea calculatoarelor 7
10.1. Declarare. Operaţii cu fişiere.
Se cunosc două nivele de prelucrare a fişierelor şi anume:
1. Nivelul inferior de prelucrare – se face apel la funcţiile sistemului de operare MS-DOS (încorporat în SO Windows).
2. Nivelul superior de prelucrare – se folosesc funcţii specializate în lucrul cu fişierele.
01.12.2013 Programarea calculatoarelor 8
10.1. Declarare. Operaţii cu fişiere.
Observaţie:
În limbajul C++, nu există instrucţiuni de intrare/ieşire ci numai funcţii specializate pentru aceste operaţii. (funcții care prelucrează stream-uri)
01.12.2013 Programarea calculatoarelor 9
Capitolul 10. Fişiere
10.1. Declarare. Operaţii cu fişiere
10.2. Prelucrarea fişierelor la nivel inferior
10.3. Prelucrarea fişierelor la nivel superior
10.4. Probleme rezolvate - fișiere prelucrate la nivel superior
01.12.2013 Programarea calculatoarelor 10
10.2. Prelucrarea fişierelor la nivel inferior
Pentru a putea utiliza prelucrarea fişierelor la nivel inferior, trebuie să includem în program următoarele fişiere standard:
<io.h>
<fcntl.h>
01.12.2013 Programarea calculatoarelor 11
10.2. Prelucrarea fişierelor la nivel inferior
a) Deschiderea unui fişier se efectuează pentru ca să se asocieze fişierului de pe suportul fizic, un număr întreg numit descriptor de fişier = [df].
01.12.2013 Programarea calculatoarelor 12
10.2. Prelucrarea fişierelor la nivel inferior
Descriptorii pentru fişierele standard sunt:
DENUMIRE FISIER
SEMNIFICATIE VALOARE DESCRIPTOR
stdin tastatura 0
stdout monitor 1
stderr fişier de erori 2
stdprn imprimantă 3
stdaux comunicaţie serială 4
01.12.2013 Programarea calculatoarelor 13
10.2. Prelucrarea fişierelor la nivel inferior
Funcţia utilizată este open şi are următoarea sintaxă:
Unde: cale – este un pointer către o zonă de tip
caracter, zonă în care este specificată calea de acces către fişierul ce trebuie deschis;
Dacă descrierea completă a căii de acces lipseşte, atunci fişierul va fi căutat în directorul curent.
01.12.2013 Programarea calculatoarelor 14
int open(const char *cale, int acces);
10.2. Prelucrarea fişierelor la nivel inferior
• acces - este o constantă predefinită care poate avea următoarele valori:
Se pot face şi combinaţii între aceste valori: O_RDONLY | O_WRONLY, sau O_RDONLY | O_BINARY.
01.12.2013 Programarea calculatoarelor 15
valoare semnificatie O_RDONLY deschis doar pentru citire O_WRONLY deschis doar pentru scriere O_RDWR deschis pentru citire şi scriere O_APPEND deschis pentru adăugare la sfârşit O_TEXT deschidere fişier text O_BINARY deschiderea fişier binar
10.2. Prelucrarea fişierelor la nivel inferior
Exemplu: Următoarea secvenţă de program se poate folosi pentru a
testa existenţa unui fişier cu numele “EXEMPLU.DAT”: int df; if( (df = open("C:\EXEMPLU.DAT", O_RDONLY)) == -1 ) { cout<<"Eroare la deschiderea fisierului \n"; exit(1); }
Valoarea ce o returnează funcţia open() poate fi: > 0, dacă fişierul a fost găsit -1, dacă fişierul nu a fost găsit
01.12.2013 Programarea calculatoarelor 16
10.2. Prelucrarea fişierelor la nivel inferior
b) Crearea unui fişier se efectuează cu ajutorul funcţiei creat, care are următoarea sintaxă:
Unde:
cale – este un pointer către o zonă de tip caracter, zonă în care este specificată calea de acces către fişierul ce trebuie deschis
Dacă descrierea completă a căii de acces lipseşte, atunci fişierul va fi căutat în directorul curent.
01.12.2013 Programarea calculatoarelor 17
int creat(const char *cale, int mod);
10.2. Prelucrarea fişierelor la nivel inferior
• mod – este modul de acces la fişierul respectiv:
valorile returnate de funcţia creat sunt:
> 0, dacă fişierul poate fi creat
-1, în caz contrar
01.12.2013 Programarea calculatoarelor 18
valoare semnificatie S_IREAD creat pentru citire S_IWRITE creat pentru scriere S_EXEC fişier executabil
10.2. Prelucrarea fişierelor la nivel inferior
Exemplu:
Următoarea secvenţă de program se poate folosi pentru testa existenţa unui fişier cu numele “FISIER.DAT”:
int df;
if( (df = creat("C:\FISIER.DAT", S_WRITE)) == -1 )
{
cout<<"Eroare la deschiderea (crearea) fisierului\n";
exit(1);
}
01.12.2013 Programarea calculatoarelor 19
10.2. Prelucrarea fişierelor la nivel inferior
c) Citirea datelor dintr-un fişier se efectuează cu ajutorul funcţiei read, care are următoarea sintaxă:
Se citeşte secvenţial din fişierul desemnat de descriptorul de fişier df un număr de octeţi - lung care se depun la adresa desemnată de buf
01.12.2013 Programarea calculatoarelor 20
int read(int df, void *buf, int lung);
Capitolul 10. Fişiere
10.1. Declarare. Operaţii cu fişiere
10.2. Prelucrarea fişierelor la nivel inferior
10.3. Prelucrarea fişierelor la nivel superior
10.4. Probleme rezolvate - fișiere prelucrate la nivel superior
01.12.2013 Programarea calculatoarelor 21
10.3. Prelucrarea fişierelor la nivel superior
Pentru a putea utiliza prelucrarea fişierelor la nivel superior, trebuie să includem în program următorul fişier standard: <stdio.h>.
a) Declararea unei variabile de tip fisier se efectueaza astfel:
01.12.2013 Programarea calculatoarelor 22
FILE *pointer_fisier;
10.3. Prelucrarea fişierelor la nivel superior
b) Deschiderea unui fişier se efectuează cu ajutorul functiei fopen:
Unde: • nume este adresa unui sir de caractere care defineste
numele fisierului care se deschide • mod este adresa unui sir de caractere care defineste modul
de prelucrare a fisierului dupa deschidere Acest sir poate fi:
– "r" - deschidere pentru citire – "w"- deschidere pentru scriere – "a"- deschidere pentru scriere la sfarsitul fisierului
01.12.2013 Programarea calculatoarelor 23
FILE *fopen(const char *nume, const char *mod);
10.3. Prelucrarea fişierelor la nivel superior
Exemplu: Următoarea secvenţă de program se poate folosi pentru testa existenţa unui fişier cu numele “EXEMPLU.DAT”:
FILE *f; if( ( f = fopen("C:\EXEMPLU.DAT", "r") ) == -1 ) { cout<<"\nEroare la deschiderea fisierului"; exit(1); } Valoarea ce o returnează funcţia fopen poate fi: • adresa variabilei de tip fisier, dacă fişierul a fost găsit • -1, dacă fişierul nu a fost găsit
01.12.2013 Programarea calculatoarelor 24
10.3. Prelucrarea fişierelor la nivel superior
Transferul unui caracter in sau dintr-un fisier text se efectuează cu ajutorul funcţiilor putc() si getc(), care au următoarele sintaxe:
• Functia putc() scrie caracterul cu codul ASCII c in fisierul asociat lui f si returneaza valoarea lui c sau valoarea -1 in caz de eroare.
• Functia getc() returneaza codul ASCII al caracterului citit din fisierul asociat lui f.
01.12.2013 Programarea calculatoarelor 25
int putc(int c, FILE *f); int getc(FILE *f);
10.3. Prelucrarea fişierelor la nivel superior
• Transferul unui şir de caractere în sau dintr-un fişier text se realizează folosind funcţiile fgets() şi fputs() care au următoarele sintaxe:
01.12.2013 Programarea calculatoarelor 26
char fgets(char *s, int n, FILE *f); int fputs(const char *s, FILE *f);
10.3. Prelucrarea fişierelor la nivel superior
• Citiri/scrieri cu format se realizează cu funcţiile fscanf() şi fprintf() care permit citirea respectiv scrierea în fişier şi care au următoarele sintaxe:
01.12.2013 Programarea calculatoarelor 27
int fscanf(FILE *f, const *format, . . .); int fprintf(FILE *f, const *format, . . .);
10.3. Prelucrarea fişierelor la nivel superior
• Închiderea unui fişier se realizează cu ajutorul funcţiei fclose() care are următoarea sintaxă:
01.12.2013 Programarea calculatoarelor 28
int fclose(FILE *f);
Capitolul 10. Fişiere
10.1. Declarare. Operaţii cu fişiere.
10.2. Prelucrarea fişierelor la nivel inferior
10.3. Prelucrarea fişierelor la nivel superior
10.4. Probleme rezolvate - fișiere prelucrate la nivel superior
01.12.2013 Programarea calculatoarelor 29
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 1:
Se citeşte un şir de numere întregi din fişierul “NUMERE.TXT”.
Fişierul conţine: – pe primul rând numărul n de elemente ale şirului
– apoi pe al doilea rând elementele şirului separate prin spaţii.
Să se afişeze elementele pare din şir.
01.12.2013 Programarea calculatoarelor 30
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 31
Date de intrare: NUMERE.TXT 5 6 7 -2 4 11
Date de ieşire: 6 -2 4
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x;
int main()
{
f = fopen("NUMERE.TXT", "r");
fscanf(f, "%d", &n);
01.12.2013 Programarea calculatoarelor 32
Primul parametru: variabila de tip fisier Al doilea parametru: formatul valorilor care se citesc Al treilea parametru: adresele variabilelor in care se citesc valorile citite
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
for(i=1; i<=n; i++)
{
fscanf(f, "%d", &x);
if(x % 2 == 0)
cout<<x<<" ";
}
fclose(f);
}
01.12.2013 Programarea calculatoarelor 33
01.12.2013 Programarea calculatoarelor 34
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 2:
Un program care citeşte un şir de numere de la tastatură şi apoi scrie în fişierul "FISIER.DAT", pe o linie, câte două numere consecutive, inserând între ele suma lor.
01.12.2013 Programarea calculatoarelor 35
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 36
Date de intrare: 7 0 1 2 3 4 5 6
Date de ieşire: FISIER.DAT 0 1.0 1 1 3.0 2 2 5.0 3 3 7.0 4 4 9.0 5 5 11.0 6
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *pf;
int i, n, x[30], nr;
double a;
01.12.2013 Programarea calculatoarelor 37
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
int main() { cout<<"\ndati nr. de elemente : "; cin>>nr; for(i = 1; i <= nr; i++) { cout<<"x["<<i<<"] = "; cin>>x[i]; }
01.12.2013 Programarea calculatoarelor 38
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
pf = fopen("fisier.dat","w"); for(n=1 ; n<=nr; n++) { a = x[n] + x[n+1]; fprintf(pf, "%d %4.2f %d\n", x[n], a, x[n+1]); } fclose(pf); }
01.12.2013 Programarea calculatoarelor 39
Primul parametru: variabila de tip fisier Al doilea parametru: formatul valorilor care se afiseaza Al treilea parametru: adresele variabilelor din care se afiseaza valorile citite
01.12.2013 Programarea calculatoarelor 40
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 3:
Se citeşte un şir de numere întregi din fişierul “NUMERE.TXT”.
Fişierul conţine: – pe primul rând numărul n de elemente ale şirului
– apoi pe al doilea rând elementele şirului separate prin spaţii.
Să se afişeze primul şi ultimul număr din şir.
01.12.2013 Programarea calculatoarelor 41
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 42
Date de intrare: NUMERE.TXT 7 -3 4 10 90 -9 11 15
Date de ieşire: -3 15
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x[100];
int main()
{
f = fopen("NUMERE.TXT", "r");
fscanf(f, "%d", &n);
01.12.2013 Programarea calculatoarelor 43
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
for(i=1; i<=n; i++)
fscanf(f, "%d", &x[i]);
cout<<x[1]<<" "<<x[n]<<"\n";
fclose(f);
}
01.12.2013 Programarea calculatoarelor 44
01.12.2013 Programarea calculatoarelor 45
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 4:
În fişierul “SIR.TXT” există pe fiecare linie câte un număr din şirul primelor n (n<300) numere naturale nenule.
Excepţie face un singur număr care a fost omis.
Să se determine care număr lipseşte.
01.12.2013 Programarea calculatoarelor 46
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 47
Date de intrare: SIR.TXT 2 4 5 1
Date de ieşire: 3
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *f;
int suma = 0, nr=0, x, numar;
int main()
{
f = fopen("SIR.TXT", "r");
01.12.2013 Programarea calculatoarelor 48
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
while( !feof(f) ) { fscanf(f, "%d\n", &x); suma+=x; nr++; } fclose(f); numar=(nr+1)*(nr+2)/2 – suma; cout<<"Numarul lipsa este: "<<numar; }
01.12.2013 Programarea calculatoarelor 49
01.12.2013 Programarea calculatoarelor 50
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 5:
Se citesc numere întregi din fişierul “MATRICE.TXT”.
Fişierul conţine: – pe primul rând numerele n şi m, n reprezentând câte linii se
află în fişier începând cu linia a doua, iar m reprezintă câte numere întregi se află pe fiecare linie
– apoi începând de pe al doilea rând elementele unei matrice separate prin câte un spaţiu.
Să se afişeze cea mai mică şi cea mai mare valoare din matricea citită.
01.12.2013 Programarea calculatoarelor 51
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 52
Date de intrare: MATRICE.TXT 3 3 11 -3 6 0 8 -14 8 15 2
Date de ieşire: -14 15
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, j, n, m, a[10][10], min, max;
int main()
{
f = fopen("MATRICE.TXT", "r");
fscanf(f, "%d %d", &n, &m);
01.12.2013 Programarea calculatoarelor 53
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
fscanf(f, "%d", &a[i][j]);
fclose(f);
01.12.2013 Programarea calculatoarelor 54
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
min=10000; max=-10000; for(i=1; i<=n; i++) for(j=1; j<=m; j++) { if(a[i][j] < min) min = a[i][j]; if(a[i][j] > max) max = a[i][j]; } cout<<min<<" "<<max; }
01.12.2013 Programarea calculatoarelor 55
01.12.2013 Programarea calculatoarelor 56
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Problema 6:
Se citeşte un şir de numere întregi din fişierul “NUMERE.TXT”.
Fişierul conţine: – pe primul rând numărul n de elemente ale şirului
– apoi pe fiecare din următoarele n rânduri câte un element al şirului.
Să se afişeze suma elementelor pozitive din şir.
01.12.2013 Programarea calculatoarelor 57
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
Exemplu:
01.12.2013 Programarea calculatoarelor 58
Date de intrare: NUMERE.TXT 6 -5 6 7 -2 4 -10
Date de ieşire: 17
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
#include<stdio.h>
#include<iostream.h>
FILE *f;
int i, n, x[100], suma=0;
int main()
{
f = fopen("NUMERE.TXT", "r");
fscanf(f, "%d", &n);
01.12.2013 Programarea calculatoarelor 59
10.4. Probleme rezolvate – fișiere prelucrate la nivel superior
for(i=1; i<=n; i++) { fscanf(f, "%d\n", &x[i]); if(x[i] > 0) suma = suma + x[i]; } fclose(f); cout<<suma; }
01.12.2013 Programarea calculatoarelor 60
01.12.2013 Programarea calculatoarelor 61
Probleme propuse spre rezolvate – fișiere prelucrate la nivel superior
1. Să dă un număr natural n(1<=n<=1000). Să se creeze un fișier text cu primele n numere prime. Pe câte un rând se vor scrie 10 numere separate prin câte un spațiu. Exemplu:
01.12.2013 Programarea calculatoarelor 62
Date de intrare: 13
Date de ieșire: PRIME.TXT 2 3 5 7 11 13 19 23 29 31 37 41
Probleme propuse spre rezolvate – fișiere prelucrate la nivel superior
2. Să dă fișierul NUMERE.IN, care conține pe fiecare rând numere de tip întreg separate prin câte un spațiu. Să se construiască fisierul NUMERE.OUT, care să conțină numărul cel mai mare corespunzător fișierului NUMERE.IN. Exemplu:
01.12.2013 Programarea calculatoarelor 63
Date de intrare: NUMERE.IN 23 89 76 -90 100 34 78 34 89 35 234 56 67 80 78
Date de ieșire: NUMERE.OUT 100 234 80
Probleme propuse spre rezolvate – fișiere prelucrate la nivel superior
3. Să dă un fișier text cu numere naturale mai mici sau egale cu 10000000, separate prin câte un spațiu. Să se afișeze pe monitor numărul de pătrate perfecte care se găsesc în fișier. Exemplu:
01.12.2013 Programarea calculatoarelor 64
Date de intrare: PATRATE.TXT 12 23 36 90 81 88 771 45 1 990 23 12
Date de ieșire: 3
Întrebări?
01.12.2013 Programarea calculatoarelor 65