Sunteți pe pagina 1din 41

Programare procedural C7

Operaii de intrare-ieire. Fiiere

Grigore ALBEANU
http://www.ad-astra.ro/galbeanu/

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 1
Cuprins
z Funcii de intrare-ieire folosind consola: cu
format implicit/explicit, descriptori de format
z Funcii de intrare-ieire generale: tipurile FILE
i FILE *, funcii pentru deschiderea/nchiderea
fiierelor, funcii pentru lucrul cu fiiere text,
funcii pentru lucrul cu fiiere binare, alte
funcii.
z Exemple de funcii C i programe C pentru
rezolvarea unor probleme: Evaluarea funciilor
polinomiale, Metoda lui Nichomachus pentru
determinarea cmmdc, Algoritmul Roy-Warshall,
Sortarea datelor cu memorarea intern a
cheilor, Sortare extern prin interschimbare,
Sortare extern prin metoda seleciei.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 2
Funcii de intrare-ieire folosind
consola (1)
z Consola sau dispozitivul standard de
intrare-ieire reprezentate de tastatur
(zona de date - stdin) i ecran (zonele
de date - stdout i stderr) permit
utilizatorului interaciunea cu programul
aflat n executare. Sunt posibile operaii
de citire/scriere fr formatare i operaii
de citire/scriere cu formatare.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 3
Funcii de intrare-ieire folosind
consola (2)
z Operaii de citire/scriere fr formatare:
getchar(), getch(), getche(), gets(),
puts()
z Operaii de citire/scriere cu format
explicit: scanf(), printf()
z Descriptori de format pentru scriere
z Descriptori de format pentru citire

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 4
Operaii de citire/scriere fr formatare: getchar(), getch(),
getche(), gets(), puts()

z Funciile permit lucrul cu caractere (char)


sau cu iruri de caractere (* char).
z Pentru citirea unui caracter din stdin pot
fi utilizate funciile: int getchar(void); int
getche(void); i int getch(void); ultimele
dou variante nefiind prevzute de
standardul ANSI, dar sunt prezente n
versiunile Borland (fiierul antet
conio.h).

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 5
Funciile getchar(), getch() i getche()

z Funcia getchar ntoarce primul caracter din stdin,


care corespunde primei taste apsate, dar numai dup
apsarea tastei Enter. Caracterul este transformat n
ntreg fr semn. n cazul unei erori sau la ntlnirea
combinaiei EOF (sfrit de fiier) funcia ntoarce
valoarea -1 (codificat prin EOF).
z Funcia getche (getch echo) ateapt apsarea unei
taste i ntoarce caracterul corespunztor pe care l
afieaz pe ecran (nu e nevoie de Enter).
z Funcia getch este similar cu getche(), dar nu
afieaz ecoul pe ecran.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 6
Funcia putchar()

z Pentru scrierea unui caracter la stdout se


utilizeaz funcia int putchar (int c); care
afieaz pe ecran caracterul cu codul ASCII c.
z Dac operaia reuete, funcia ntoarce
caracterul afiat, iar n caz de eec valoarea
EOF (-1).
unsigned int reverse_line(void){
int c = getchar();
unsigned int length = ((c == '\n') ? 0 : 1 + reverse_line());
putchar(c);
return length;
}

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 7
Funciile gets() i puts()
z Pentru citirea (resp. scrierea) irurilor de caractere se lucreaz cu
funcia gets (respectiv puts).
z Funcia cu prototipul char *gets (char *s); citete caractere din
stdin i le depune n zona de date de la adresa s, pn la
apsarea tastei Enter. n ir, tastei Enter i va corespunde
caracterul '\0'. Dac operaia reuete, funcia ntoarce adresa
irului, altfel valoarea NULL ( = 0 ).
z Funcia cu prototipul int puts(const char *s); afieaz pe ecran
irul de la adresa s sau o constant ir de caractere (secven de
caractere ntre ghilimele) i apoi trece la linie nou. La succes,
funcia ntoarce ultimul caracter, altfel valoarea EOF (-1).

char s1[100], s2[100];


puts("s1="); gets(s1);
puts("s2="); gets(s2);
if(strcmp(s1,s2)==0) puts("Siruri identice.");
else puts("Siruri diferite.");
G. Albeanu, Programare procedurala,
Versiunea 2009-2010 C7 8
Operaii de citire/scriere cu
formatare: scanf(), printf()
z La citire, formatarea specific conversia datelor de la
reprezentarea extern n reprezentarea binar.
z Pentru operaia ce scriere se efectueaz conversia
invers.
z Pentru citirea datelor se utilizeaz funcia scanf cu
prototipul:
int scanf( const char * format [, lista_adrese_variabile]);
z Funcia scanf ntoarce numrul de cmpuri citite i
depuse la adresele din list. Dac nu s-a stocat nici o
valoare, funcia ntoarce valoarea 0.
z Pentru scrierea datelor se utilizeaz funcia printf cu
prototipul:
int printf( const char *format, lista_valori);
z Funcia printf ntoarce numrul de octei transferai sau
EOF (-1) n caz de eec.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 9
irul de caractere format
z irul de caractere format poate conine n general:

I. specificatori de format: iruri precedate de caracterul '%' care descriu


fiecare cmp ateptat;
II. caractere de spaiere: spaiu (' '), tab ('\t'), linie nou ('\n');
III. orice alt caracter ASCII (Unicode).

z Fiecrei variabile din list i corespunde o specificaie de format (tipul I.).


z Funcia scanf citete succesiv caractere din stdin pe care le
interpreteaz prin compararea succesiv a caracterului citit cu informaia
curent din irul format. Prezena unui caracter de tip II determin citirea
fr memorare a secvenei pn la ntlnirea unui caracter de tip I sau III.
Prezena unui caracter de tip III determin citirea fr stocare a
caracterului curent de la tastatur, dac este identic.
z La scriere, caracterele de tip II i III se afieaz pe ecran aa cum apar n
irul format.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 10
Descriptori pentru scriere (1)
z Forma general a unui descriptor pentru scriere este:
% [flags] [width][.prec][lmod] type
specificaiile dintre [ i ] fiind opionale.
z Elementele de mai sus au urmtoarea semnificaie:

flags - poate fi unul dintre semnele: +, -, 0, spaiu, #. Semnele au


urmtoarea semnificaie:
- : aliniere la stnga a argumentului n cadrul cmpului;
+ : numerele vor fi obligatoriu tiprite cu semn;
0 : indic completarea la stnga cu zerouri (la numere);
spaiu: dac primul caracter nu este semnul, se va afia un
spaiu;
# : foreaz inserarea simbolului 0 in faa numerelor octale, a
secvenei 0x sau 0X n faa numerelor hexazecimale i a
punctului zecimal atunci cnd fie partea real, fie partea
fracionar a unui numr lipsete

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 11
Descriptori pentru scriere (2)
z width: este un numr care specific limea minim a
cmpului. Argumentul corespunztor va fi afiat pe un cmp
cu lime cel puin width. Dac sunt mai puine caractere de
scris, se va completa cmpul cu spaii la stnga (implicit) sau
la dreapta, dac s-a specificat flagul -. Dac s-a specificat
flagul 0, se va completa la stnga cu zero. Dac width este
caracterul *, atunci limea este dat de urmtorul argument
din list (trebuie s fie neaprat un int).
z prec: este un numr care specific precizia de scriere; pentru
%s prec indic numrul maxim de caractere ce se va scrie;
pentru %e, %E i %f prec indic numrul de zecimale; pentru
%g i %G prec indic numrul de cifre semnificative, iar la
descriptorii pentru ntregi indic numrul minim de cifre. Dac
prec este *, atunci se consider c limea de scriere este
dat de urmtorul argument din list, care trebuie s fie de tip
int.
z lmod: este un specificator de lungime care specific un
argument short sau unsigned short (h), long sau unsigned
long (l), respectiv long double (L).

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 12
Descriptori pentru scriere (3)
z type: este descriptorul propriu-zis.
z Se utilizeaz urmtoarele caractere:
d, i (int) - notaie zecimal cu semn;
o (int) - notaie n baza 8 fr semn;
x, X (int) - notaie n baza 16 fr semn cu abcdef pentr x i
ABCDEF pentru X;
u (int) - notaie zecimal fr semn;
c (int) - un caracter;
s (char *) - ir de caractere terminat cu \0;
f (double) - numrul n virgul mobil cu format standard;
e, E (double) - numrul n virgul mobil cu format exponenial;
g, G (double) - n loc de f, e, E;
p (void *) - se tiprete argumentul ca adres;
% - se tiprete %.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 13
Descriptori pentru citire
z Forma general a unui descriptor pentru citire este:
% [*][width][lmod]type
unde:
* - suprim atribuirea urmtorului cmp din stdin la urmtoarea variabil;
width, lmod au semnificaia prezentat n cadrul descriptorilor pentru
scriere;
type - descrie tipul de conversie.
z Cele mai importante specificaii de conversie sunt:
d (int *) - ntreg zecimal;
i (int *) - ntreg oarecare (zecimal, octal sau hexa);
o (int *) - ntreg octal;
u (unsigned int *) - ntreg zecimal fr semn;
x (int *) - ntreg hexa,
c (char *) - caractere;
s (char *) - ir de caractere (se va ncheia cu \0);
e, f, g (float *) - numere n virgul mobil;
p (void *) - valoarea unei adrese aa cum e tiprit de printf.
z n descrierea de mai sus, ntre paranteze se indic tipul argumentului
supus operaiei de intrare-ieire. Notaia tip * nseamn adres a unei
locaii de tipul tip.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 14
Exemplul 1. (Evaluarea unei funcii
polinomiale date explicit):

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 15
Exemplul 2. (O implementare a algoritmului lui Nicomachus -
utilizarea scderilor repetate - pentru determinarea celui mai mare
divizor comun a dou numere naturale nenule)

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 16
Exemplul 3. (Implementarea algoritmului lui Roy Warshall
pentru determinarea matricei existene drumurilor pentru
un graf (o hart) G cu maxim 20 de vrfuri (orae))

z Se noteaz cu x
matricea de adiacen a
grafului (x[i][j] = 1 dac
vrfurile i i j sunt
conectate direct, x[i][j] =
0, n caz contrar). Se va
obine matricea y cu
elemente: y[i][j] = 1
dac vrfurile i i j sunt
conectate printr-un
drum, y[i][j] = 0, n caz
contrar.
z Dac x descrie o relaie
binar R atunci y
reprezint matricea
nchiderii tranzitive a
relaiei R.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 17
Exemplul 4. (Evaluarea unor funcii).

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 18
FILE *
z Conceptul de baz relativ la operaiile de intrare-ieire standard este cel
de pointer la fiier. Mai precis, n fiierul stdio.h este definit un tip de
structur, numit FILE. Din punct de vedere intern, fiierele prezente n
funciile de intrare-ieire sunt specificate prin variabile de tip FILE *.
z Declararea unui pointer la fiier se realizeaz prin: FILE * <identificator>;
z Dispozitivele de intrare-ieire standard au asociate permanent cte un
asemenea pointer al crui nume este predefinit: stdin (consola pentru
intrare), stdout (consola pentru ieire), stderr (consola pentru ieire),
stdaux (pentru primul port al interfeei seriale ), stdprn (pentru primul
port al interfeei paralele); ultimii doi identificatori fiind caracteristici
implementrii BORLAND pentru calculatoare compatibile IBM -
Microsoft.
z n fiierul stdio.h, mai sunt definite constantele FILENAME_MAX (pentru
a indica lungimea maxim a numelui unui fiier, din punct de vedere
extern) i FOPEN_MAX (care precizeaz numrul maxim de fiiere ce
pot fi deschise simultan.)

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 19
Fluxuri de date
z Se disting dou categorii de tipuri de transfer:
un stream de tip text care transfer secvene de caractere organizate n linii; n C separarea
liniilor se face prin caracterul LF. Pentru adaptarea la dispozitivul fizic poate fi necesar
nlocuirea caracterului LF cu secventa CR-LF.
un stream binar care transfer o secven de octei fr alte prelucrri.
z Distingerea ntre cele dou categorii nu este obligatorie; programatorul este cel care trebuie
s rezolve eventualele probleme de conversie a datelor.
z Prin operaia de deschidere, se aloc o zon de memorie de dimensiune sizeof (FILE) care va
conine: numele extern al fiierului, adresa unei zone tampon util n realizarea transferurilor i
informaii utile privind starea operaiilor de intrare-ieire. Aceast conexiune logic rezultat n
urma deschiderii unui fiier se numete stream (sau flux de date).
z Eliberarea zonei alocate se realizeaz n urma operaiei de nchidere.

z Deschiderea fiierelor se realizeaz folosind funcia fopen care returneaz, cnd toate
condiiile de prelucrare sunt ndeplinite, un pointer ctre structura FILE. Este unica modalitate
prin care se atribuie corect o valoare unui pointer la fiier.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 20
Funcia fopen()
z Prototipul funciei fopen este:
FILE * fopen(const char * nume_fis, const char * mod_acces);
unde:
z nume_fis este un ir de caractere (constant sau obinut prin atribuire) care specific numele extern al
fiierului,
z mod_acces este un ir de caracter (constituit similar) care descrie modul de acces.
z n cazul unei operaii de deschidere corecte, pointerul returnat de apel este diferit de NULL, n caz contrar
rezultatul apelului este NULL.
z Modurile posibile de acces sunt:
deschidere flux de tip text (r sau rt), respectiv flux binar (rb) pentru citire (mod reset);
deschidere flux de tip text (w sau wt), respectiv flux binar (wb) pentru scriere (cu distrugerea fiierului
anterior, dac acesta exista- mod rewrite);
deschidere flux de tip text (a sau at), respectiv flux binar (ab) pentru adugare la sfrit (mod append);
deschidere flux de tip text (r+ sau r+t), respectiv flux binar (r+b) pentru actualizare (citire i scriere
folosind acelai pointer la fiier);
deschidere flux de tip text (w+ sau w+t), respectiv flux binar (w+b) pentru actualizare (dac fiierul exista
anterior, coninutul su se pierde);
deschidere flux de tip text (a+ sau a+t), respectiv flux binar (a+b) pentru actualizare cu scriere la sfritul
fiierului.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 21
Alte funcii (1)
z nchiderea fiierelor se realizeaz apelnd funcia fclose definit astfel:
int fclose(FILE * <identificator>);
care ntoarce EOF (= -1) n caz de eroare sau 0 n caz normal.
z Prin nchidere nceteaz conexiunea logic dintre pointer i fiier cu scrierea
datelor din zona tampon de ieire (n cazul deschiderii pentru scriere/actualizare),
respectiv cu pierderea datelor din zona tampon de intrare (n cazul deschiderii
pentru citire/actualizare).
z Detectarea sfritului de fiier se realizeaz prin utilizarea macrodefiniiei feof cu
prototipul:
int feof(FILE * <identificator>);
al crei rezultat este nenul (s-a detectat EOF) respectiv zero (nu s-a detectat EOF).
z Asocierea unui nou fiier la un flux deschis deja se realizeaz folosind funcia
freopen cu prototipul:
FILE * freopen(const char * <id_fis_extern>, const char * <mod_acces>, FILE * p_fis);
unde p_fis este identificatorul fluxului existent care se va nchide n urma apelului i
se va deschide fiierul cu numele <id_fis_extern> n modul de prelucrare
<mod_acces> atribuind pointerul la structura creat variabilei p_fis. Funcia
returneaz valoarea atribuit lui p_fis.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 22
Alte funcii (2)
z Forarea scrierii zonelor tampon asociate fiierelor deschise
pentru scriere se realizeaz folosind funcia fflush cu prototipul:
int fflush(FILE * <id_fis>);
care returneaz EOF n caz de eroare, respectiv 0 n cazul normal.

z Multe aplicaii necesit lucrul cu fiiere temporare care s fie


terse automat la nchidere sau la terminarea normal a
programului.
z n sprijinul programatorului, pentru a nlesni astfel de activiti,
biblioteca C ofer o funcie cu prototipul: FILE *tmpfile(void); care
la apel creeaz un fiier temporar n modul wb+. Funcia
ntoarce un pointer la acel fiier. Apeluri succesive vor deschide
fiiere distincte.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 23
Aplicaii (1)

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 24
Alte funcii (3)
z Alte operaii la nivel de fiier sunt:
tergerea unui fiier - folosind funcia
int remove(const char * nume_fis);
schimbarea numelui - folosind funcia
int rename(const char *f_nou, const char *f_vechi);
z Ambele funcii ntorc o valoare nenul n caz de eroare i zero n cazul normal.
z Folosind funcia rewind are loc poziionarea la nceputul fiierului. Prototipul
funciei rewind este:
void rewind(FILE *fp);

z Pentru a obine informaii despre un fiier se pot utiliza funciile stat i fstat cu
prototipul declarat n fiierul stat.h din catalogul sys. Ne vom referi la funcia stat.
Aceasta are prototipul:
int stat (char *cale, struct stat * statzona);
unde: cale reprezint numele fiierului sau catalogului, iar statzona este adresa unei
structuri de tip stat ale crei cmpuri descriu starea entitii n discuie. De
exemplu, cmpul st_size furnizeaz dimensiunea unui fiier, n octei.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 25
Fluxuri text (1)
Flux de tip text: Scriere cu format.
z Se pot folosi urmtoarele funcii: fprintf, printf, sprintf,
vfprintf, vprintf, vsprinf.
z Ne vom referi numai la funciile fprintf i printf.
z Funcia fprintf este o funcie cu numr variabil de
parametrii avnd prototipul:
int fprintf(FILE *fp, const char *format, ...);
unde fp se refer la fluxul de date deschis n vederea
realizrii transferului, iar format respect specificaiile
descrise n momentul prezentrii funciilor scanf() i
printf().
z Funcia printf(format, ...) este echivalent cu
fprintf(stdout,format, ...).
G. Albeanu, Programare procedurala,
Versiunea 2009-2010 C7 26
Fluxuri text (2)
Flux de tip text: Citire cu format.
z Se pot folosi urmtoarele funcii: fscanf, scanf,
sscanf. Acum ne vom referi numai la funciile
fscanf i scanf.
z Funcia fscanf este o funcie cu numr variabil
de argumente i are prototipul:
int fscanf(FILE *fp, const char *format, ...);
z Parametrii apelului au aceleai semnificaii ca
mai sus, iar apelul scanf (format, ...) este
echivalent cu fscanf(stdin, format,
list_adrese).

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 27
Fluxuri text (3)
Flux de tip text: Citire de caractere din fiiere text.
z Se pot utiliza funcia fgetc i macrodefiniia getc.
z Funcia cu prototipul int fgetc(FILE *fp); ntoarce
urmtorul caracter din fp ca un ntreg fr semn,
convertit la int sau EOF dac s-a detectat sfritul de
fiier sau a aprut o eroare.
z Macrodefiniia cu prototipul int getc(FILE *fp); este
echivalent cu funcia fgetc. Reamintim posibilitatea
utilizrii apelului getchar() echivalent cu getc(stdin).

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 28
Fluxuri text (4)
Flux de tip text: Scriere de caractere n fiiere text.
z Scrierea unui caracter c ntr-un fiier text cu
identificatorul intern fp se realizeaz folosind funcia cu
prototipul:
int fputc(int c, FILE *fp);
care returneaz c n cazul succesului, respectiv EOF n
caz de eec.
z Se poate utiliza i macroinstruciunea cu prototipul int
putc(int c, FILE *fp); similar cu fputc.
z Apelul putchar(c); este echivalent cu putc(c, stdout);

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 29
Fluxuri text (5)
z Citirea unui ir de caractere din fiiere text se realizeaz
folosind funcia cu prototipul:
char *fgets(char *s, int n, FILE *fp);
la al crei apel se citesc, n s, cel mult n-1 caractere din
fiierul fp la care se adaug caracterul \0 i se
returneaz s sau NULL n caz unei erori sau la ntlnirea
codului EOF.
z Reamintim utilizarea funciei cu prototipul:
char *gets(char *s);
care citete urmtoarea linie de la consol i o depune n s.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 30
Fluxuri text (6)
z Scrierea unui ir de caractere ntr-un fiier text
se realizeaz n urma apelului funciei cu
prototipul:
int fputs(const char *s, FILE *fp);
care ntoarce EOF n caz de eroare, respectiv
numrul de caractere transferate n caz de
succes.
z Pentru scriere la consol se utilizeaz funcia:
int puts(const char *s);

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 31
Fluxuri binare (1)
z n aceast categorie intr funciile de intrare/ieire n
acces direct care citesc/scriu din/n fiiere fr nici o
conversie i fr a se face vreo interpretare a datelor.
z Noiunea fundamental este cea de zon compact de
octei (nregistrare) care se citete sau se scrie.
z Citirea/scrierea se face de la / la poziia curent din
fiier, care poate fi modificat cu funcii speciale dup
cum vom vedea mai jos.
z Dup executarea operaiei, poziia indicatorului (de
octet n cazul limbajului C) este actualizat automat,
pentru a indica urmtoarea nregistrare.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 32
Fluxuri binare (2)
z Citirea a nrec nregistrri din fiierul cu identificatorul fp, fiecare
avnd lungimea L, cu stocare n tabloul ptr se realizeaz folosind
apelul:
n = fread(ptr, L, nrec, fp);
care ntoarce un ntreg n ce furnizeaz numrul de nregistrri citite.
Dac s-a ntlnit EOF sau eroare atunci n va fi 0.

z Pentru scrierea a nrec nregistrri de lungime L fiecare, din zona


cu adresa ptr n fiierul cu identificatorul intern fp se folosete
apelul:
m = fwrite(ptr, L, nrec, fp);
unde m va reprezenta numrul de nregistrri scrise, cu m < nrec
numai n caz de eroare.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 33
Controlul indicatorului de poziie (1)

z Citirea valorii indicatorului de poziie: Funcia fgetpos nscrie


valoarea indicatorului n variabila poz i ntoarce 0 n caz de
succes. Prototipul funciei este:
int fgetpos(FILE *fp, long int *poz);
z Funcia ftell ntoarce poziia curent n fiier n caz de succes i -
1L n caz de eec. Aceasta are prototipul:
long int ftell(FILE * fp);
z Modificarea valorii indicatorului de poziie: Sunt disponibile
funciile: fsetpos, fseek i rewind. Funcia fsetpos are prototipul:
int fsetpos(FILE *fp, const long int *poz);
i atribuie indicatorului valoarea variabilei poz i ntoarce 0 n caz de
succes.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 34
Controlul indicatorului de poziie (2)

z Funcia fseek face o deplasare a indicatorului de


poziie cu nr_octei relativ la o poziie de referin
specificat prin constanta ntreag origine.
z Se pot utiliza urmtoarele valori: 0 = SEEK_SET
(nceput de fiier), 1=SEEK_CUR (poziie curent), 2 =
SEEK_END (sfrit de fiier). Valoarea ntoars de
fseek este 0 pentru succes i nenul n caz de eec.
z Prototipul funciei fseek este:
int fseek(FILE *fp, long nr_octei, int origine);

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 35
Aplicaii (2): Aflarea dimensiunii unui fiier folosind
funciile de citire-modificare a indicatorului de poziie

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 36
Aplicaii (3): Metode de sortare a
datelor stocate n fiiere
z Sortarea datelor stocate ntr-un fiier se poate realiza cu aducerea
integral a datelor n memoria volatil (sortare intern) sau cu aducerea
n memoria principal a cte unui articol (sortare extern).
z Metodele prezentate aici nu sunt din cele mai performante, ele ilustreaz
accesul la datele stocate n fiiere i principalele modaliti de prelucrare.
z O alt metod de sortare a datelor externe utilizeaz procedeul
interclasrii coleciilor ordonate. Principiul acestei metode va fi explicat n
contextul rezolvrii problemelor prin metoda divide et impera (algoritmi
recursivi).
z Sortarea intern (Stocarea integral a datelor n memoria principal,
Sortare cu manipularea cheii de sortare i a poziiei articolului n fiier);
z Sortare extern (sortare prin interschimbare, sortare prin selecie)

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 37
Aplicaii (4)

z Stocarea integral a datelor n memoria


principal: Se va utiliza un vector de articole
(record, struct), compararea fiind realizat prin
intermediul cheii de sortare.
z Se utilizeaz pentru dimensiuni reduse.
z Pentru sortare intern se poate utiliza oricare
dintre metodele cunoscute. n final, vectorul
sortat se nregistreaz n fiierul redeschis
pentru scriere. Coninutul vechi va fi automat
distrus.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 38
Aplicatii (5)
z Sortare cu manipularea
cheii de sortare i a
poziiei articolului n fiier
(indexul articolului).
z Aceast metod
presupune memorarea
ntr-un vector numai a
valorii cheii de sortare,
mpreun cu numrul
relativ al articolului fiierul
de sortat.
z Comparaiile asupra
valorilor cheii de sortare
vor conduce la
interschimbri n vectorul
intern.
z Obinerea fiierului sortat
se va face prin
parcurgerea n acces
secvenial a fiierului iniial
i scrierea articolelor, n
ordine, n fiierul rezultat.

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 39
Aplicatii (6): sortare prin
interschimbare

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 40
Aplicatii (7): sortare prin selectie

G. Albeanu, Programare procedurala,


Versiunea 2009-2010 C7 41

S-ar putea să vă placă și