Sunteți pe pagina 1din 41

Programare procedurala M4

Operaii de intrare-ieire.
Fiiere
Grigore ALBEANU
http://www.ad-astra.ro/galbeanu/

Versiunea 2014

G. Albeanu, Programare procedurala M4

Cuprins
 Funcii de intrare-ieire folosind consola: cu format

implicit/explicit, descriptori de format


 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.
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

Funcii de intrare-ieire folosind


consola (1)
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

Funcii de intrare-ieire folosind


consola (2)
 Operaii de citire/scriere fr formatare:

getchar(), getch(), getche(), gets(=), puts(=)


 Operaii de citire/scriere cu format explicit:
scanf(=), printf(=)
 Descriptori de format pentru scriere
 Descriptori de format pentru citire

Versiunea 2013

G. Albeanu, Programare procedurala M4

Operaii de citire/scriere fr formatare: getchar(), getch(),


getche(), gets(), puts()

 Funciile permit lucrul cu caractere (char) sau

cu iruri de caractere (* char).


 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).

Versiunea 2013

G. Albeanu, Programare procedurala M4

Funciile getchar(), getch() i getche()


 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).
 Funcia getche (getch echo) ateapt apsarea unei taste i
ntoarce caracterul corespunztor pe care l afieaz pe ecran
(nu e nevoie de Enter).
 Funcia getch este similar cu getche(), dar nu afieaz ecoul
pe ecran.

Versiunea 2013

G. Albeanu, Programare procedurala M4

Funcia putchar()
 Pentru scrierea unui caracter la stdout se utilizeaz

funcia int putchar (int c); care afieaz pe ecran


caracterul cu codul ASCII c.
 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;
}
Versiunea 2013

G. Albeanu, Programare procedurala M4

Funciile gets() i puts()


 Pentru citirea (resp. scrierea) irurilor de caractere se lucreaz cu

funcia gets (respectiv puts).


 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 ).
 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.");
Versiunea 2013

G. Albeanu, Programare procedurala M4

Operaii de citire/scriere cu formatare:


scanf(), printf()
 La citire, formatarea specific conversia datelor de la

reprezentarea extern n reprezentarea binar.


 Pentru operaia ce scriere se efectueaz conversia invers.
 Pentru citirea datelor se utilizeaz funcia scanf cu
prototipul:
int scanf( const char * format [, lista_adrese_variabile]);

 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.
 Pentru scrierea datelor se utilizeaz funcia printf cu
prototipul:
int printf( const char *format, lista_valori);

 Funcia printf ntoarce numrul de octei transferai sau

EOF (-1) n caz de eec.

Versiunea 2013

G. Albeanu, Programare procedurala M4

irul de caractere format




irul de caractere format poate conine n general:

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).
I.




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


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.
La scriere, caracterele de tip II i III se afieaz pe ecran aa cum apar n irul
format.

Versiunea 2013

G. Albeanu, Programare procedurala M4

10

Descriptori pentru scriere (1)


Forma general a unui descriptor pentru scriere este:
% [flags] [width][.prec][lmod] type
specificaiile dintre [ i ] fiind opionale.
 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

Versiunea 2013

G. Albeanu, Programare procedurala M4

11

Descriptori pentru scriere (2)




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).
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.
lmod: este un specificator de lungime care specific un argument
short sau unsigned short (h), long sau unsigned long (l), respectiv
long double (L).

Versiunea 2013

G. Albeanu, Programare procedurala M4

12

Descriptori pentru scriere (3)


 type: este descriptorul propriu-zis.
 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 %.

Versiunea 2013

G. Albeanu, Programare procedurala M4

13

Descriptori pentru citire


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.

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.

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.


Versiunea 2013

G. Albeanu, Programare procedurala M4

14

Exemplul 1. (Evaluarea unei funcii


polinomiale date explicit):

Versiunea 2013

G. Albeanu, Programare procedurala M4

15

Exemplul 2. (O implementare a algoritmului lui Nicomachus - utilizarea


scderilor repetate - pentru determinarea celui mai mare divizor comun a
dou numere naturale nenule)

Versiunea 2013

G. Albeanu, Programare procedurala M4

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))
 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.
 Dac x descrie o relaie
binar R atunci y
reprezint matricea
nchiderii tranzitive a
relaiei R.

Versiunea 2013

G. Albeanu, Programare procedurala M4

17

Exemplul 4. (Evaluarea unor funcii).

Versiunea 2013

G. Albeanu, Programare procedurala M4

18

FILE *





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 intrareieire sunt specificate prin variabile de tip FILE *.
Declararea unui pointer la fiier se realizeaz prin: FILE * <identificator>;
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.
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.)

Versiunea 2013

G. Albeanu, Programare procedurala M4

19

Fluxuri de date








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.
Distingerea ntre cele dou categorii nu este obligatorie; programatorul este cel care trebuie s rezolve
eventualele probleme de conversie a datelor.
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).
Eliberarea zonei alocate se realizeaz n urma operaiei de nchidere.
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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

20

Funcia fopen()


Prototipul funciei fopen este:


FILE * fopen(const char * nume_fis, const char * mod_acces);

unde:





nume_fis este un ir de caractere (constant sau obinut prin atribuire) care specific numele extern al fiierului,
mod_acces este un ir de caracter (constituit similar) care descrie modul de acces.
n cazul unei operaii de deschidere corecte, pointerul returnat de apel este diferit de NULL, n caz contrar rezultatul apelului este
NULL.
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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

21

Alte funcii (1)




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.


 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).
 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).
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

22

Alte funcii (2)


 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.

 Multe aplicaii necesit lucrul cu fiiere temporare care s fie terse

automat la nchidere sau la terminarea normal a programului.


 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

23

Aplicaii (1)

Versiunea 2013

G. Albeanu, Programare procedurala M4

24

Alte funcii (3)







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);
Ambele funcii ntorc o valoare nenul n caz de eroare i zero n cazul normal.
Folosind funcia rewind are loc poziionarea la nceputul fiierului. Prototipul funciei rewind
este:
void rewind(FILE *fp);

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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

25

Fluxuri text (1)


Flux de tip text: Scriere cu format.
 Se pot folosi urmtoarele funcii: fprintf, printf, sprintf, vfprintf,

vprintf, vsprinf.
 Ne vom referi numai la funciile fprintf i printf.
 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().
 Funcia printf(format, ...) este echivalent cu
fprintf(stdout,format, ...).

Versiunea 2013

G. Albeanu, Programare procedurala M4

26

Fluxuri text (2)


Flux de tip text: Citire cu format.
 Se pot folosi urmtoarele funcii: fscanf, scanf,
sscanf. Acum ne vom referi numai la funciile fscanf
i scanf.
 Funcia fscanf este o funcie cu numr variabil de
argumente i are prototipul:
int fscanf(FILE *fp, const char *format, ...);
 Parametrii apelului au aceleai semnificaii ca mai
sus, iar apelul scanf (format, ...) este echivalent cu
fscanf(stdin, format, list_adrese).

Versiunea 2013

G. Albeanu, Programare procedurala M4

27

Fluxuri text (3)


Flux de tip text: Citire de caractere din fiiere text.
 Se pot utiliza funcia fgetc i macrodefiniia getc.
 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.
 Macrodefiniia cu prototipul int getc(FILE *fp); este echivalent
cu funcia fgetc. Reamintim posibilitatea utilizrii apelului
getchar() echivalent cu getc(stdin).

Versiunea 2013

G. Albeanu, Programare procedurala M4

28

Fluxuri text (4)


Flux de tip text: Scriere de caractere n fiiere text.
 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.
 Se poate utiliza i macroinstruciunea cu prototipul int putc(int c,
FILE *fp); similar cu fputc.
 Apelul putchar(c); este echivalent cu putc(c, stdout);

Versiunea 2013

G. Albeanu, Programare procedurala M4

29

Fluxuri text (5)


 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.
 Reamintim utilizarea funciei cu prototipul:
char *gets(char *s);
care citete urmtoarea linie de la consol i o depune n s.

Versiunea 2013

G. Albeanu, Programare procedurala M4

30

Fluxuri text (6)


 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.
 Pentru scriere la consol se utilizeaz funcia:
int puts(const char *s);

Versiunea 2013

G. Albeanu, Programare procedurala M4

31

Fluxuri binare (1)


 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.
 Noiunea fundamental este cea de zon compact de octei
(nregistrare) care se citete sau se scrie.
 Citirea/scrierea se face de la / la poziia curent din fiier, care
poate fi modificat cu funcii speciale dup cum vom vedea mai
jos.
 Dup executarea operaiei, poziia indicatorului (de octet n
cazul limbajului C) este actualizat automat, pentru a indica
urmtoarea nregistrare.

Versiunea 2013

G. Albeanu, Programare procedurala M4

32

Fluxuri binare (2)


 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.
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

33

Controlul indicatorului de poziie (1)


 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);
 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);
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

34

Controlul indicatorului de poziie (2)


 Funcia fseek face o deplasare a indicatorului de poziie cu

nr_octei relativ la o poziie de referin specificat prin


constanta ntreag origine.
 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.
 Prototipul funciei fseek este:
int fseek(FILE *fp, long nr_octei, int origine);

Versiunea 2013

G. Albeanu, Programare procedurala M4

35

Aplicaii (2): Aflarea dimensiunii unui fiier folosind


funciile de citire-modificare a indicatorului de poziie

Versiunea 2013

G. Albeanu, Programare procedurala M4

36

Aplicaii (3): Metode de sortare a


datelor stocate n fiiere






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).
Metodele prezentate aici nu sunt din cele mai performante, ele ilustreaz
accesul la datele stocate n fiiere i principalele modaliti de prelucrare.
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).
Sortarea intern (Stocarea integral a datelor n memoria principal, Sortare cu
manipularea cheii de sortare i a poziiei articolului n fiier);
Sortare extern (sortare prin interschimbare, sortare prin selecie)

Versiunea 2013

G. Albeanu, Programare procedurala M4

37

Aplicaii (4)
 Stocarea integral a datelor n memoria

principal: Se va utiliza un vector de articole (record,


struct), compararea fiind realizat prin intermediul
cheii de sortare.
 Se utilizeaz pentru dimensiuni reduse.
 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.

Versiunea 2013

G. Albeanu, Programare procedurala M4

38

Aplicatii (5)


Sortare cu manipularea cheii


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

Versiunea 2013

G. Albeanu, Programare procedurala M4

39

Aplicatii (6): sortare prin


interschimbare

Versiunea 2013

G. Albeanu, Programare procedurala M4

40

Aplicatii (7): sortare prin selectie

Versiunea 2013

G. Albeanu, Programare procedurala M4

41

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