Documente Academic
Documente Profesional
Documente Cultură
Curs Hatz
Curs Hatz
Operaii cu fiiere
Un fiier este o colecie de date de acelai tip, numite nregistrri, memorate pe suport extern ( hard disc,CD,... ).
Avantajele utilizrii fiierelor sunt o consecin a proprietilor memoriilor externe. Fiierele permit memorarea
unui volum mare de date persistente. Un fiier are o nregistrare care marcheaz sfritul de fiier. n cazul
fiierelor de intrare de la tastatur sfritul de fiier se genereaz prin CTRL+Z. El poate fi pus n eviden folosind
constanta simbolic EOF definit n stdio.h.
Prelucrarea fiierelor implic un numr de operaii specifice acestora. Orice fiier, nainte de a fi prelucrat, trebuie
s fie deschis. De asemenea la terminarea prelucrrii unui fiier acesta trebuie nchis.
Operaiile de deschidere nchidere se pot realiza prin intermediul unor funcii speciale de bibliotec.
Alte operaii frecvente:
- Crearea unui fiier;
- Actualizarea unui fiier;
- Poziionarea ntr-un fiier;
- Consultarea unui fiier;
- Adugarea de nregistrri ntr-un fiier;
- Stergerea unui fiier.
Sistemul de I/O din C separ printr-o anumit abstractizare programatorul de echipament. Forma abstract se
numete stream iar instrumentul efectiv care se poate utiliza este fiierul.
In C, conform standardului, se poate lucra cu fiiere fie la nivel binar, fie la nivel de caracter. Diferena const n
modul n care sunt tratate inregistrrile din fiier. Astfel, dac acestea sunt tratate la nivel de caracter, atunci
operaiile de IO se vor realiza prin utilizarea unor structuri de tipul ir de caractere, referite fie sub form de
variabile de tip ir de caractere (char[]) fie pointeri spre caractere (char*).
Dac accesul la fiier se face in mod binar, atunci datele se vor referi prin pointeri de tipul void*. Prin intermediul
acestora, practic se poate face referire la orice tip de dat din program. Astfel, fiierele tratate la nivel binar pot
salva date de orice tip. Evident, n comparaie cu tratarea fiierelor la nivel ir de caractere, nu avem un delimitator
de nregistrare (precum caracterul \0), astfel nct, la fiecare operaie de scriere / citire trebuie s se specifice
lungimea nregistrrii, adic numrul de octei scrii / citii.
Trebuie s remarcm faptul c limbajul de programare C unific modul de lucru cu fiierele. Astfel, intrrile /
ieirile sunt tratate unitar, fie c vorbim de fiiere de pe disc fie c vorbim despre dispozitivele standard de intrare /
ieire precum stdin, stdout sau stderr. Astfel, funciile de citire / scriere din dispozitivele standard, din fiiere sau
iruri de caractere precum scanf / fscanf / sscanf respectiv printf / fprintf / sprintf sunt realizate in mod unitar i au
utilizare similar.
La acest nivel se utilizeaz funcia fopen pentru deschiderea unui fiier. Ea returneaz un pointer spre tipul FILE
(tipul fiier), tip definit n fiierul stdio.h. In caz de eroare, funcia fopen returneaz pointerul NULL. Funcia fopen
realizeaz o alocare de memorie i returneaz zona de memorie alocat n cazul in care sistemul de operare
reueste s deschid fiierul specificat n modul de deschidere solicitat de funcie.
Prototipul funciei fopen este:
FILE *fopen(const char *cale, const char *mod);
unde:
1
cale
mod
r
deschidere n citire (read); fiierul trebuie s existe.
w deschidere n scriere (write); se deschide un fiier gol. Dac fiierul deja exist pe disc, coninutul acestuia
este ters i se creaz un fiier nou
a
deschidere pentru adugare (append); datele vor fi scrise la finalul fiierului. Dac fiierul nu exist, atunci
acesta este creat.
r+ deschidere pentru modificare (citire sau scriere); fiierul trebuie s existe
w+ creaz un fiier gol pentru scriere / citire;
a+ deschide un fiier pentru citire i adugare.
Dac se deschide un fiier inexistent cu modul w sau a, atunci el este deschis n creare. Dac se deschide un
fiier existent cu modul w, atunci coninutul vechi al fiierului se pierde i se va crea unul nou cu acelai nume.
Menionm c stdin, stderr, stdaux i stdprn sunt pointeri spre tipul FILE i permit ca funciile de nivel superior de
prelucrare a fiierelor s poat trata intrarea standard i ieirile standard pe terminal i imprimant la fel ca i
fiierele pe celelelate suporturi. Singura deosebire const c aceste fiiere nu se deschid i nici se nchid de ctre
programator. Ele sunt deschise automat la lansarea n execuie a programului i se nchid la apelul funciei exit.
Variabilele stdin, stderr, stdaux i stderr exist n program ca i variabile globale, iar declaraiile lor sunt introduse
prin stdio.h
Exemplu. Programul scrie la ieirea stdout caracterele unui fiier a crui cale este argumentul din linia de comand
(pentru detalii n legtur cu parametrii transmii prin linia de comand). Dac nu exist un argument n linia de
comand, atunci se citete de la intrarea standard.
#include <stdio.h>
int main(int argc,char *argv[]) /* listeaza la ieirea stdout un fisier a carui cale este argumentul din linia de
comanda */
{
FILE *pf;
int c;
if(argc == 1) /* nu exista argument in linia de comanda */
pf = stdin;
else // se deschide fisierul a carui cale se afla n argv[ 1] //
if((pf = fopen( argv[1], "r"))==NULL) {
printf("nu se poate deschide fisierul %s/n",*argv);
return -1;
}
while((c = getc(pf)) != EOF )
putchar(c);
fclose(pf);
return 0;
}
Funcia fscanf este asemntoare cu funcia scanf. Ea are un parametru n plus fa de scanf, un pointer spre tipul
FILE care definete fiierul din care se face citirea. Acest pointer este primul parametru al funciei fscanf. Ceilali
parametri au aceeai semnificaie ca i n cazul funciei scanf.
Rezult c funcia fscanf poate fi apelat printr-o expresie de atribuire de forma
nr=fscanf(pf,control,par1, par2,...parn);
unde:
- pf este un pointer spre tipul FILE i valoarea lui a fost definit prin apelul funciei fopen (aceasta definete
fiierul din care se face citirea) iar ceilali parametri sunt identici cu cei utilizai la apelul funciei scanf .
Funcia fscanf, ca i scanf, returneaz numrul cmpurilor citite din fiier.
La ntlnirea sfritului de fiier se returneaz valoarea EOF definit n fiierul stdio.h. Pentru ps=stdin, functia
fscanf este identic cu scanf.
Funcia fprintf este analoag cu funcia printf. Primul ei parametru este un pointer spre tipul FILE i el definete
fiierul n care se scriu datele. Ceilali parametri sunt identici cu cei ai funciei printf.
Funcia fprintf, ca i funcia printf, returneaz numrul caracterelor scrise n fiier sau -1 n caz de eroare. Pentru
sf=stdout, funcia fprintf este identic cu printf. De asemenea, se pot utiliza pointerii standard obinuii:
stderr
- afiarea mesajelor de eroare pe terminal
stdaux
- comunicaie serial
stdprn
- ieirea paralel la imprimant.
Menionm c la comunicaia serial se poate conecta o imprimant serial.
unde:
- ptr este pointerul spre zona tampon ce conine articolele citite / scrise (nregistrarea citit / scris);
- dim este un ntreg ce reprezint lungimea unui articol;
- nrart este un ntreg ce reprezint numrul articolelor care se transfer;
- pf este un pointer spre tipul FILE care definete fiierul din care se face citirea.
De obicei, dim este dimensiunea (sizeof) a tipului ctre care pointeaz pointerul ptr.
Ambele funcii returneaz numrul articolelor transferate sau -1 n caz de eroare.
Exemplu. Programul citete dde la intrarea stdin datele ale cror formate sunt definite mai jos i le scrie n fiierul
misc.dat din directorul curent. Formatul datelor de intrare este urmtorul:
Tip
denumire
I
REZISTENTA
#include <stdio.h>
#define MAX 50
val
010
um
KG
cod
12345678
pret
1.5
cantitate
10000.0
typedef struct {
char tip[2];
char den[MAX + 1];
int val;
char unit[3];
long cod;
float pret;
float cant;
} TIP_ARTICOL;
int cit(TIP_ARTICOL *str) //citeste datele de la intrarea standard si le scrie in structura spre care pointeaza str
{
int c,nr;
float x,y;
while((nr = scanf("%1s %50s %3d %2s %1d", str->tip, str->den, &str->val, str->unit, &str->cod))!= 5 ||
scanf("%f %f", &x, &y) != 2)
{
if(nr == EOF ) return EOF;
printf("rand eronat; se reia \n");
5
FILE
*pf;
int i,n;
TIP_ARTICOL
if((pf
*/
a[6];
= fopen("misc.dat","r")) == NULL) {
printf("nu se poate deschide fisierul misc.dat in citire\n");
return -1;
}
printf("%60s\n\n\n","INTRARI\n\n");
// se citeste o inregistrare
while((n = fread(a, sizeof(TIP_ARTICOL), 6, pf )) > 0)
// se listeaza articolele de tip I dintr-o inregistrare
for (i = 0; i < n; i++) {
if ( a[i].tip[0]
== 'I')
printf("%s
%3d %s %d %.2f
%.2f\n",
a[i].cod, a[i].pret, a[i].cant);
}
fclose(pf);
return 0;
}
a[i].den,
a[i].val,
a[i].unit,