Reprezinta codul ASCII al unui caracter. Se
poate reprezenta in unul din modurile:
Fisiere
Caracteristicile
generale ale fisierelor
Operatiile
care pot fi realizate asupra fisierelor sunt: deschiderea unui fisier,
scrierea intr-un fisier, citirea dintr-un fisier, pozitionarea
intr-un fisier, inchiderea unui fisier.
Deschiderea
unui fisier
Functia fopen
Creaza
un flux de date intre fisierul specificat prin numele extern (nume_fisier)
si programul C. Parametrul mod specifica sensul fluxului de date
si modul de interpretare a acestora. Functia returneaza un
pointer spre tipul FILE, iar in caz de eroare - pointerul NULL (prototip in
stdio.h).
FILE *fopen(const char
*nume_fisier, const char *mod);
Parametrul
mod este o constanta sir de caractere, care poate contine
caracterele cu semnificatiile:
r: flux de date de intrare; deschidere pentru citire;
w: flux de date de iesire; deschidere pentru scriere (creaza un
fisier nou sau suprascrie continutul anterior al fisierului
existent);
a: flux de date de iesire cu scriere la sfarsitul fisierului,
adaugare, sau crearea fisierului in cazul in care acesta nu
exista;
+: extinde un flux de intrare sau iesire la unul de
intrare/iesire; operatii de scriere si citire asupra unui
fisier deschis in conditiile r, w sau a.
b: date binare;
t: date text (modul implicit).
Exemple:
'r+'
– deschidere pentru modificare (citire si scriere);
'w+'
– deschidere pentru modificare (citire si scriere);
'rb'
– citire binara;
'wb'
– scriere binara;
'r+b'
– citire/scriere binara.
Functia freopen
(stdio.h)
FILE *freopen(const
char*nume_fis,const char*mod,FILE *flux_date);
Asociaza
un nou fisier unui flux de date deja existent, inchizand legatura cu
vechiul fisier si incercand sa deschida una noua, cu
fisierul specificat. Functia returneaza pointerul catre
fluxul de date specificat, sau NULL in caz de esec (prototip in stdio.h).
Functia open
int open(const char
*nume_fisier, int acces [,int mod]);
Deschide
fisierul specificat conform cu restrictiile de acces precizate in
apel. Returneaza un intreg care este un indicator de fisier sau -1
(in caz de esec) (prototip in io.h).
Restrictiile
de acces se precizeaza prin aplicarea operatorului | (disjunctie logica la nivel de bit) intre anumite
constante simbolice, definite in fcntl.h,
cum sunt :
O_RDONLY - citire;
O_WRONLY - scriere
O_RDWR - citire
si scriere
O_CREAT - creare
O_APPEND - adaugare
la sfarsitul fisierului
O_TEXT - interpretare
CR-LF
O_BINARY - nici o
interpretare.,
Restrictiile
de mod de creare se realizeaza cu ajutorul constantelor:
S_IREAD - permisiune de citire
din fisier
S_IWRITE - permisiune
de scriere din fisier, eventual legate prin operatorul “|”.
Functia creat
int creat(const char
*nume_fisier, int un_mod);
Creaza
un fisier nou sau il suprascrie in cazul in care deja exista.
Returneaza indicatorul de fisier sau -1 (in caz de esec).
Parametrul un_mod este obtinut in mod analog celui de la functia de
deschidere (prototip in io.h).
Functia
creatnew
int creatnew(const char
*nume_fisier, int mod);
Creaza
un fisier nou, conform modului specificat. Returneaza indicatorul
fisierului nou creat sau rezultat de eroare (-1), daca fisierul
deja exista (prototip in io.h).
Dupa
cum se observa, informatia furnizata pentru deschiderea unui
fisier este aceeasi in ambele abordari, diferenta constand
in tipul de date al entitatii asociate fisierului. Implementarea din
io.h ofera un alt tip de control la nivelul comunicarii cu echipamentele
periferice (furnizat de functia ioctrl),
asupra caruia nu vom insista, deoarece desfasurarea acestui tip
de control este mai greoaie, dar mai profunda.
Inchiderea
unui fisier
Functia fclose
Functia
inchide un fisier deschis cu fopen si elibereaza memoria
alocata (zona tampon si structura FILE). Returneaza valoarea 0
la inchiderea cu succes a fisierului si -1 in caz de eroare (prototip
in stdio.h).
Functia fcloseall
Inchide
toate fluxururile de date si returneaza numarul fluxurilor de
date inchise (prototip in stdio.h).
Functia close
int close(int
indicator);
Inchide
un indicator de fisier si returneaza 0 (in caz de succes) sau -1
in caz de eroare (prototip in io.h).
Prelucrarea
fisierelor text
Prelucrarea unui fisier la nivel de caracter
Fisierele
pot fi scrise si citite caracter cu caracter folosind functiile putc (pentru scriere) si getc (citire).
Functia
putc
int putc (int c, FILE
*pf);
c –
este codul ASCII al caracterului care se scrie in fisier;
pf
– este pointerul spre tipul FILE a carui valoare a fost returnata de
functia fopen.
Functia
putc returneaza valoarea lui c (valoarea scrisa in caz de succes),
sau –1 (EOF) in caz de eroare sau sfarsit de fisier.
Functia
getc
Functia
citeste un caracter dintr-un fisier (pointerul spre tipul FILE
transmis ca argument) si returneaza caracterul citit sau EOF la
sfarsit de fisier sau eroare.
Exemplul 1
Sa se scrie un program care creaza un
fisier text in care se vor scrie caracterele introduse de la
tastatura (citite din fisierul standard de intrare), pana la
intalnirea caracterului ^Z = Ctrl+Z.
#include <stdio.h>
#include <process.h>
void main()
while((c=getchar())!=EOF) // sau: while
((c=getc(stdin)) != EOF)
putc(c,pfcar); // scrierea caracterului in fisier
fclose(pfcar); // inchiderea fisierului
}
Exemplul 2
Sa se scrie un program care citeste un
fisier text, caracter cu caracter, si afiseaza continutul
acestuia.
#include <stdio.h>
#include <process.h>
void main()
while((c=getc(pfcar))!=EOF) //citire din fisier, la nivel de caracter
//scrierea caracterului citit in fisierul standard
de iesire (afisare pe monitor)
fclose(pfcar);
}
Prelucrarea unui fisier la nivel de cuvant
Functiile putw
si getw (putword si getword) sunt echivalente cu functiile
putc si getc, cu diferenta ca unitatea transferata nu este
un singur octet (caracter), ci un cuvant (un int).
int getw(FILE *pf);
int putw (int w, FILE
*pf);
Se
recomanda utilizarea functiei feof pentru a testa intalnirea
sfarsitului de fisier.
Exemplul 1
int tab[100];
FILE *pf;
// . . . deschidere fisier
while (!feof(pf))
}
printf('Sfarsit de
fisiern');
Exemplu:l 2
#include <stdio.h>
#include
<process.h>
void main()
while((c=getchar())!=EOF) // sau:
while ((c=getc(stdin)) != EOF)
putc(c,pfcar); // scrierea caracterului Śn fisier
fclose(pfcar); // Śnchiderea fisierului
}
Prelucrarea unui fisier la nivel de sir de
caractere
Intr-un fisier text, liniile sunt considerate ca
linii de text separate de sfarsitul de linie ('n'), iar in memorie, ele
devin siruri de caractere terminate de caracterul nul ('0'). Citirea unei
linii de text dintr-un fisier se realizeaza cu ajutorul functiei
fgets, iar scrierea intr-un
fisier - cu ajutorul functiei fputs.
Functia
fgets este indentica cu functia gets, cu deosebirea ca
functia gets citeste din fisierul standard de intrare (stdin).
Functia fputs este indentica cu functia puts, cu deosebirea
functia puts scrie in fisierul standard de iesire (stdout).
Functia fputs
int fputs(const char *s,
FILE *pf);
Functia
scrie un sir de caractere intr-un fisier si primeste ca
argumente pointerul spre zona de memorie (buffer-ul) care contine
sirul de caractere (s) si pointerul spre structura FILE. Functia
returneaza ultimul caracter scris, in caz de succes, sau -1 in caz de
eroare.
Functia fgets
char *fgets(char *s, int
dim, FILE *pf);
Functia
citeste maximum dim-1 octeti (caractere) din fisier, sau
pana la intalnirea sfarsitului de linie. Pointerul spre zona in care
se face citirea caracterelor este s. Terminatorul null ('0') este plasat
automat la sfarsitul sirului (buffer-lui de memorie). Functia
returneaza un pointer catre buffer-ul in care este memorat sirul
de caractere, in caz de succes, sau pointerul NULL in cazul esecului.
Exemplul 1
Sa se scrie un program care creaza un
fisier text in care se vor scrie sirurile de caractere introduse de
la tastatura.
#include <stdio.h>
void main()
fclose(pfsir);
}
Exemplul 2
Sa se scrie un program care citeste un
fisier text, linie cu linie, si afiseaza continutul
acestuia
#include <stdio.h>
void main()
fclose(pfsir);}
Exemplul 3
Sa se scrie un program care creeaza un fisier
text “tabel”:
#include <stdio.h>
#include
<stdlib.h>
#include <math.h>
#include <string.h>
#define PI 3.1415926
void main()
fclose(pfsir);
}
Exemplul 4
Scrieti un program care sa faca o copie
(caracter cu caracter) a unui fisier text dat.
//Patrut 5/113
#include <stdio.h>
void main(void)
if ((out = fopen(dest, 'wt')) ==
NULL)
// se copiaza caracterele din 'in'
in 'out'
while (!feof(in))
fputc(fgetc(in),out);
fclose(in); fclose(out);
}
Fisiere - continuare
Intrari/iesiri
binare
Exemplul 1
Sa se scrie un program care creaza un
fisier binar in care se vor introduce
numere reale, nenule.
#include
<iostream.h>
#include <stdio.h>
int main()
cout<<'nIntroduceti
numere(diferite de 0) terminate cu un 0:'<<'n';
cin>>nr;
while(nr!=0)
fclose(f);
return 0;
}
Exemplul 2
Sa se scrie un program ce citeste dintr-un fisier binar numere reale,
nenule.
#include
<iostream.h>
#include <stdio.h>
int main()
cout<<'nNumerele nenule citite
din fisier sunt:'<<'n';
while((fread(&buf, sizeof(buf), 1,
f))==1)
// functia sizeof(buf)
care returneaza numarul de octeti necesari variabilei buf.
cout<<buf<<' ';
fclose(f);
cout<<'n';
return 0;
}
Pozitionarea
intr-un fisier
Pe langa mecanismul de pozitionare implicit
(asigurat prin operatiile de citire si scriere) se pot folosi si
operatiile de pozitionare explicita.
Functia fseek
int fseek(FILE *pf, long
deplasament, int referinta);
Functia
deplaseaza capul de citire/scriere al discului, in vederea
prelucrarii inregistrarilor fisierului intr-o ordine oarecare.
Functia seteaza pozitia curenta in fluxul de date la n
octeti fata de referinta):
deplasament – defineste numarul
de octeti peste care se va deplasa capul discului;
referinta
– poate avea una din valorile:
0 - inceputul fisierului
(SEEK_SET);
1 - pozitia curenta
a capului (SEEK_CUR);
2 - sfarsitul
fisierului (SEEK_END).
Functia
returneaza valoarea zero la pozitionarea corecta si o
valoare diferita de zero in caz de eroare (prototip in stdio.h).
Functia lseek
int lseek(int indicator,
long n, int referinta);
Seteaza
pozitia curenta de citire/scriere in fisier la n octeti
fata de referinta. Returneaza valoarea 0 in caz de succes
si diferita de zero in caz de eroare (prototip in io.h).
Functia fgetpos
int fgetpos(FILE
*flux_date, fpos_t *pozitie);
Determina
pozitia curenta (pointer catre o structura, fpos_t, care
descrie aceasta pozitie in fluxul de date). Inscrie valoarea
indicatorului in variabila indicata de pozitie. Returneaza 0 la
determinarea cu succes a acestei pozitii sau valoare diferita de zero
in caz de esec. Structura care descrie pozitia poate fi
transmisa ca argument functiei fsetpos (prototip in stdio.h).
Functia fsetpos
int fsetpos(FILE
*flux_date, const fpos_t *pozitie);
Seteaza
pozitia curenta in fluxul de date (atribuie indicatorului valoarea
variabilei indicate pozitie), la o valoare
obtinuta printr apelul functiei fgetpos. Returneaza
valoarea 0 in caz de succes, sau diferita de 0 in caz de esec
(prototip in stdio.h).
Exista functii pentru modificarea valorii
indicatorului de pozitie si de determinare a pozitiei curente a
acestuia.
Functia ftell
Indica
pozitia curenta a capului de citire in fisier. Functia
returneaza o valoare de tip long int care reprezinta pozitia
curenta in fluxul de date (deplasamentul in octeti a pozitiei
capului fata de inceputul fisierului) sau -1L in caz de eroare
(prototip in stdio.h).
Functia tell
long tell(int
indicator);
Returneaza
pozitia curenta a capului de citire/scriere in fisier
(exprimata in numar de octeti fata de inceputul
fisierului), sau -1L in caz de eroare (prototip in io.h).
Functia rewind
void rewind(FILE
*flux_date);
Pozitioneaza
indicatorul la inceputul fluxului de date specificat ca argument (prototip in
stdio.h).
Functii
utilitare pentru lucrul cu fisiere
Functii de testare a sfarsitului de fisier
Functia feof
int feof(FILE
*flux_date);
Returneaza
o valoare diferita de zero in cazul intalnirii sfarsitului de
fisier sau 0 in celelalte cazuri (prototip in stdio.h).
Functia eof
Returneaza valoarea 1 daca pozitia
curenta este sfarsitul de fisier, 0 daca indicatorul este
pozitionat in alta parte, sau -1 in caz de eroare (prototip in io.h).
Functii
de
golire a fluxurilor de date
Functia fflush
int fflush(FILE
*flux_date);
Goleste
un fluxul de date specificat ca argument. Returneaza 0 in caz de succes
si -1 (EOF) in caz de eroare (prototip in stdio.h).
Functia flushall
Goleste
toate fluxurile de date existente, pentru cele de scriere efectuand si
scrierea in fisiere. Returneaza numarul de fluxuri asupra
carora s-a efectuat operatia (prototip in stdio.h).
Alte
operatii cu fisiere
Functii care permit operatii ale sistemului de
operare asupra fisierelor
Functia remove
int remove(const char
*nume_fisier);
Sterge
un fisier. Returneaza valoarea 0 pentru operatie
reusita si -1 pentru operatie esuata (prototip in
stdio.h).
Functia rename
int rename(const char
*nume_vechi, const char *nume_nou);
Redenumeste
un fisier. Returneaza 0 pentru operatie reusita si -1
in cazul esecului (prototip in stdio.h).
Functia unlink
int unlink(const char
*nume_fisier);
Sterge
un fisier. Returneaza 0 la operatie reusita si -1
la esec; daca fisierul are permisiune read-only, functia nu
va reusi operatia (prototip in io.h,
stdio.h).
Functii
care permit
manipularea aceluiasi fisier prin doua indicatoare de fisier
independente
Functia dup
Duplica
un indicator de fisier. Returneaza noul indicator de fisier
pentru operatie reusita sau -1 in cazul esecului (prototip
in io.h).
Functia dup2
int dup2(int
indicator_vechi, int indicator_nou);
Duplica
un indicator de fisier la valoarea unui indicator de fisier deja
existent. Returneaza 0 in caz de succes si -1 in caz de esec
(prototip in io.h).
Functii
pentru aflarea sau modificarea dimensiunii in octeti a fisierelor
Functia chsize
int chsize(int indicator,
long lungime);
Modifica
dimensiunea unui fisier, conform argumentului lungime. Returneaza 0
pentru operatie reusita sau -1 in caz de esec (prototip in
stdio.h).
Functia filelength
long filelength(int
indicator);
Returneaza
lungimea unui fisier (in octeti) sau
-1 in caz de eroare (prototip in io.h).
Functii
de lucru
cu fisiere temporare care ofera facilitati de lucru
cu fisiere temporare prin generarea de nume unice de fisier in zona
de lucru.
Functia tmpfile
Deschide
un fisier temporar, ca flux de date, in mod binar (w+b). Returneaza
pointerul catre fisierul deschis in cazul operatiei
reusite, sau NULL in caz de esec (prototip in stdio.h).
Functia tmpnam
char *tmpnam(char
*sptr);
Creaza
un nume unic pentru fisierul temporar (prototip in stdio.h).
Functia creattemp
int creattemp(char
*cale, int attrib);
Creeaza
un fisier unic ca nume, cu atributele specificate in argumentul attrib
(prin _fmode,O_TEXT sau O_BINARY), in directorul dat in argumentul cale.
Returneaza indicatorul (handler-ul) catre fisierul creat sau -1
(si setarea errno) in cazul esecului (prototip in io.h).
Exemplu: - Fisier despre angajatii unei
intreprinderi
Sa se creeze un fisier binar, care va
contine informatiile despre angajatii unei intreprinderi: nume,
marca, salariu. Sa se afiseze apoi continutul fisierului.
#include<iostream.h>
#include <stdio.h>
#include <ctype.h>
typedef struct
angajat;
union
buffer;
int main()
do
while(toupper(cont)!='N');
fclose(pf);
//citirea informatiilor
if ((pf= fopen(nume_fis, 'rb')) == NULL)
Aplicatie
pentru gestiunea materialelor dintr-un depozit.
Aplicatia va avea un meniu principal si va
permite gestiunea urmatoarelor informatii: codul materialului (va fi
chiar 'numarul de ordine'), denumirea acestuia, unitatea de
masura, pretul unitar, cantitatea contractata si cea
receptionata (vectori cu 4 elemente). Memorarea datelor se va face
intr-un fisier de date (un fisier binar cu structuri), numit
'material.dat'. Aplicatia contine urmatoarele
functii:
help()
- informare privind optiunile programului
Functii
pentru fisierele binare, care sa suplineasca lipsa
functiilor standard pentru organizarea directa a fisierelor
binare:
citireb() - citire in acces direct din fisier;
scrieb() - scriere in acces direct in
fisier;
citmat() - citirea de la terminal a
informatiilor despre un material;
afismat() - afisarea informatiilor despre
un material (apelata de list);
lungfisis()
- determinarea lungimii fisierului
existent;
crefis() - creare fisier.
Functii
pentru adaugarea, modificarea, stergerea si listarea de materiale.
#include
<process.h>
#include
<iostream.h>
#include <stdio.h>
#include <ctype.h>
typedef struct material
;
material mat;
FILE *pf;
void
crefis(),adaug(),modif(),sterg(),list(),help();
void main()
}while(toupper(optiune)!='E');
}
void help() // afisare informatii despre
utilizarea meniului si optiunile acestuia
long int lungfis(FILE
*f) // returneaza lungimea
fisierului
void
scrieb(int nr,void *a,FILE *f) //scriere
in fisierul binar
}
void
citireb(int nr,void *a,FILE *f) //citire
din fisierul binar
}
void
afismat(material *a) //afisarea
informatiilor despre un anumit material
else cout<<'Acest
articol a fost sters !'<<'n';
}
void
citmat(material *a) //citirea
informatiilor despre un anumit material
cout<<'Introduceti cantitatile
receptionate : '<<'n';
for(i=0;i<4;i++)
}
void
crefis() //deschidere fisier
void
adaug() //adaugare de noi materiale
while(mat.codm);
fclose(pf);
}
void
modif() //modificarea informatiilor
despre un material existent
while(ch!='D'
&& ch!='N');
if(ch=='D')
}
}while(na);
fclose(pf);
}
void
sterg() //stergerea din fisier a unui
material
while(!(n>=0 && n<=na));
if(n) scrieb(n,&mat,pf);
}while(n);
fclose(pf);
}
void
list() //afisare
informatii despre un anumit material
}while(na);
fclose(pf);
}
Probleme practice
Scrieti un program de
tiparire a continuturilor mai multor fisiere, ale caror
nume se transmit ca parametri catre functia main. Tiparirea se
face pe ecran (lungimea paginii = 22) sau la imprimanta (lungimea paginii
= 61). Continutul fiecarui fisier va incepe pe o pagina
noua, cu un titlu care indica numele fisierului. Pentru fiecare
fisier, paginile vor fi numerotate (cu ajutorul unui contor de pagini).
Scrieti un program
care citeste un fisier text. Pornind de la continutul acestuia,
se va crea un alt fisier, prin inlocuirea spatiilor consecutive cu
unul singur. Se vor afisa pe ecran continutul fisierului de la
care s-a pornit si continutul fisierului obtinut.
Sa se consulte
continutul unui fisier si sa se afiseze
urmatoarele informatii statistice: numarul de cuvinte din
fisier, numarul de caractere, numarul de linii, numarul de
date numerice (nu cifre, numere!).
Scrieti un program
care sa compare continutul a doua fisiere, si
afisati primele linii care difera si pozitia
caracterelor diferite in aceste linii.
Scrieti un program
care citeste continutul unui fisier sursa scris in limbajul
C si afiseaza in ordine
alfabetica fiecare grup al numelor de variabile care au primele n
caractere identice (n este citit de la tastatura).
Scrieti un program
care consulta un fisier text si afiseaza o lista
a tuturor cuvintelor din fisier. Pentru fiecare cuvant se vor afisa
si numerele liniilor in care apare cuvantul.
Scrieti un program
care citeste un text introdus de la tastatura si
afiseaza cuvintele distincte, in ordinea crescatoare a
frecventei lor de aparitie. La afisare, fiecare cuvant va fi
precedat de numarul de aparitii.
Scrieti un program
care citeste un text introdus de la tastatura, ordoneaza
alfabetic liniile acestuia si le afiseaza.
Scrieti o
aplicatie pentru gestiunea informatiilor despre cartile
existente intr-o biblioteca. Aplicatia va avea un meniu principal
care va permite:
Memorarea
datelor intr-un fisier (un fisier binar cu structuri), al carui
nume se introduce de la tastatura. Fisierul va contine
informatiile: nume carte, autor, editura, anul aparitiei, pret.
Pentru fiecare carte, se va genera o cota (un numar unic care sa
constituie cheia de cautare).
Adaugarea
de noi carti;
Afisarea
informatiilor despre o anumita carte;
Cautarea
titlurilor dupa un anumit autor;
Modificarea
informatiilor existente;
Lista
alfabetica a tuturor autorilor;
Stergerea
unei carti din biblioteca;
Ordonarea
descrescatoare dupa anul aparitiei;
Numele
celei mai vechi carti din biblioteca;
Numele
celei mai scumpe carti din biblioteca;
Numele
autorului cu cele mai multe carti;
Valoarea
totala a cartilor din biblioteca.