Sunteți pe pagina 1din 20

Prelucrarea fișierelor organizate

secvențial

Algoritmi și tehnici de
programare
Fișiere organizate secvențial

 Reprezentare date
 text
 binar (fișiere de date)
 Articole cu structuri (lungimi) identice / diferite
 structuri identice (descriere identică) – părți cu structură variabilă
 Ordinea în fișier
 ordinea în care au fost adăugate (de obicei)
 fără informații de regăsire
 Acces
 secvențial
 direct (poziție, nr. octeți)
Prelucrarea fișierelor binare secvențiale.
Operații generale

 Creare (de obicei cu populare)


 Consultare: cu rezultatele pe ecran/fișier text, funcție de
dimensiunea lor
 Căutare: 1 articol ce îndeplinește o proprietate
Singurele operații pentru
 Selecție: mai multe articole fișiere text
 Integrală: toate articolele

 Actualizare
 Adăugare (1 articol sau mai multe)
 Modificare (articol unic / selecție / integrală)
 Ștergere nu este definită (simulare)
Prelucrarea fișierelor binare secvențiale.
Creare+populare fișier

 Să se creeze și populeze un fişier binar cu articole cu


structura de mai jos. Sfârșitul introducerii datelor este marcat
standard (tastare CTRL/Z).
Note
typedef struct { char CNP[14]; Nr.
An
char nume[30]; discipli
Numeintși an; 0 1 … 19
CNP Grupa ne
int grupa;
prenume
unsigned int nrd;
unsigned1..3
int note[20]; 1..20 1..10 1..10 … 1..10
} STUDENT;

 Schema bloc a programului
unsigned
char [14]x; char [30]
STUDENT int int unsigned int
int Stud.dat
Date.txt CREARE
Prelucrarea fișierelor binare secvențiale.
Creare + populare fișier

Start
 Algoritmul
Deschidere Primul cîmp din structura
fișier nou articolului care se citește
(nu neapărat primul din
descriere)
CNP

Toate celelalte cîmpuri ale !feof(stdin) Da


articolului
Citire cîmpuri
Nu

Închidere Articol
fișier
CNP
Stop
void creare_pop(char nume[30]) cout << "Numar discipline:";
{ cin >> x.nrd;
FILE *f; for (i = 0; i < x.nrd; i++){
STUDENT x; cout << "Nota " << i + 1 << ":";
int i; cin >> x.note[i];
char num[30], pren[20]; }
f = fopen(nume, "wb+"); fwrite(&x, sizeof(x), 1, f);
cout << "CNP sau CTRL/Z:"; cout << "CNP sau CTRL/Z:";
cin >> x.CNP; cin >> x.CNP;
while (!feof(stdin)){ }
cout << "Nume:"; fclose(f);
cin >> num >> pren; }
strcat(num," ");
strcat(num, pren);
strcpy(x.nume, num);
cout << "An:";
cin >> x.an;
cout << "Grupa:";
cin >> x.grupa;
void creare_pop(char nume[30]) for (i = 0; i < x.nrd; i++){
{ cout << "Nota " << i + 1 << ":";
FILE *f; cin >> x.note[i];
STUDENT x; }
int i; fwrite(&x, sizeof(x), 1, f);
char temp[3]; cout << "CNP sau CTRL/Z:";
f = fopen(nume, "wb+"); cin >> x.CNP;
cout << "CNP sau CTRL/Z:"; }
cin >> x.CNP; fclose(f);
while (!feof(stdin)){ }
cout << "Nume:";
cin.getline(temp, 3);
cin.getline(x.nume, 30);
cout << "An:";
cin >> x.an;
cout << "Grupa:";
cin >> x.grupa;
cout << "Numar discipline:";
cin >> x.nrd;
void creare_pop(char nume[30]) fwrite(&x, sizeof(x), 1, f);
{ printf_s("%s", "CNP sau CTRL/Z:");
FILE* f; gets_s(temp);
STUDENT x; gets_s(x.CNP);
int i; }
char temp[3]; fclose(f);
fopen_s(&f,nume, "wb"); }
printf_s("%s", "CNP sau CTRL/Z:");
gets_s(x.CNP);
while (!feof(stdin)) {
printf_s("%s", "Nume si prenume: ");
gets_s(x.nume);
printf_s("%s", "An: ");
scanf_s("%d", &x.an);
printf_s("%s", "Grupa: ");
scanf_s("%d", &x.grupa);
printf_s("%s", "Numar discipline: ");
scanf_s("%d", &x.nrd);
for (i = 0; i < x.nrd; i++) {
printf_s("%s%d%s", "Nota ", i + 1,": ");
scanf_s("%d", &x.note[i]);
}
Prelucrarea fișierelor binare organizate secvențial
Consultare - căutarea unui articol

 Să calculeze media studenților ale căror CNP se introduc de la


tastatură. Sfârșitul introducerii datelor este marcat standard.
(Consultare secvențială, 1 articol, cu posibilitate de repetare.)

 Schema bloc a programului


 
AFIŞARE Stud.dat


Prelucrarea fișierelor binare organizate secvențial
Consultare - căutarea unui articol
Start
 Algoritmul Deschidere
fișier

CNP căutat

!feof(stdin) Da

Nu Prelucrare CNP
căutat
Închidere
fișier
CNP căutat
Stop
Prelucrarea fișierelor binare organizate secvențial
Consultare - căutarea unui articol
Prelucrare CNP căutat
Poziționare pe
 Algoritmul început fișier f

Articol x

vb = 0

!feof(f) și vb==0 Da
Prelucrare
Nu articol
Nu vb==0 Da Articol x
Nu a fost
găsit CNP

Ieșire
Prelucrarea fișierelor binare organizate secvențial
Consultare - căutarea unui articol

 Algoritmul Prelucrare articol

CNP == CNP
Nu Da
căutat
m=0
m = m + nota[i]
i = 0,n-1
m = m/n

nume, m
vb = 1

Ieșire
Prelucrarea fișierelor binare organizate secvențial
Consultare cu selecție
 Să se listeze în câte un fișier text ASCII numele studenților din grupele
ale căror numere se introduc de la tastatură. Sfârșitul introducerii
datelor este marcat standard.
 Observație: problemă de consultare secvențială ,cu mai multe articole,
selecție după un câmp cu valori duplicate și cu posibilitate de repetare
 Schema bloc a programului

 
Listare Stud.dat

Prelucrarea fișierelor binare organizate secvențial
Consultare, cu selecție

void consultare_selectie(char nume_fis[30]) Start


{
 Algoritmul
int nrgr;
Deschidere
char *nume_fisO;
char nume1[30]="Grupa"; fișier
char nume2[7];
fprintf(stderr,"Grupa sau CTRL/Z:"); nr.gr.c.
cin >> nrgr; Afisari pe monitor - fprintf, fputs ...
_itoa(nrgr,nume2,10);
nume_fisO = strcat(nume1, nume2);
!feof(stdin) Da
while (!feof(stdin)){ Stdout va fi asociat cu nume_fisO
prelucreaza(nume_fis, nume_fisO,nrgr);
fprintf(stderr,"Grupa sau CTRL/Z:"); Nu Prelucrare
cin >> nrgr; nr.gr.c.
_itoa(nrgr, nume2, 10); Închidere
char nume[30] = "Grupa"; fișier
nume_fisO = strcat(nume, nume2); Este creat lista “Grupa”+nrgr
} nr.gr.c.
} Stop
Prelucrarea fișierelor binare organizate secvențial
Consultare, cu selecție
Prelucrare nr.gr.c.
Poziționare pe
 Algoritmul început fișier f

Deschide lista

Articol x

vb = 0

!feof(f) Da

Nu
Prelucrare
articol
Închide lista

Nu vb==0 Da
Articol x
mesaj succes mesaj eroare
Șterge lista

Ieșire
Prelucrarea fișierelor nume_fis[30],
void prelucreaza(char binare organizate secvențial
char *nume_fisO, int nrgr)
Consultare,
{ cu selecție
FILE *f;
STUDENT x;
freopen(nume_fisO, "w", stdout);
 fAlgoritmul
= fopen(nume_fis, "rb");
fread(&x, sizeof(x), 1, f);
int gasit = 0; Prelucrare articol
while (!feof(f)){
if (x.grupa == nrgr){
if (!gasit){ Nu gr == nr.gr.c. Da
cout << "Grupa " << nrgr << endl;
gasit = 1; Lista nume, m
Cout - scrieri exclusiv in fisierul
}
nume_fisO
cout << x.nume << endl;
Condiția}de vb = 1
selecție
fread(&x, sizeof(x), 1, f);
}
fclose(f); Ieșire
fclose(stdout);
if (!gasit)
remove(nume_fisO);
}
void consultare_selectie(char nume_fis[30])
{
int nrgr;
printf_s("%s", "Grupa sau CTRL/Z:");
scanf_s("%d", &nrgr);
while (!feof(stdin)) {
prelucreaza(nume_fis,nrgr);
printf_s("%s", "Grupa sau CTRL/Z:");
scanf_s("%d", &nrgr);
}
}
void prelucreaza(char nume_fis[30],int while (!feof(f)) {
nrgr) if (x.grupa == nrgr) {
{ if (!gasit) {
FILE* f, *lista; fprintf_s(lista,"%s%d%s","Grupa ",nrgr,"\n");
STUDENT x; gasit = 1;
}
char* nume_fisO; fprintf_s(lista, "%s%s", x.nume, "\n");
char nume2[7]; }
char nume1[30] = "Grupa"; fread(&x, sizeof(x), 1, f);
_itoa(nrgr, nume2, 10); }
nume_fisO = strcat(nume1, nume2); fclose(f);
fclose(lista);
fopen_s(&lista,nume_fisO, "w"); if (!gasit)
fopen_s(&f,nume_fis, "rb"); remove(nume_fisO);
fread(&x, sizeof(x), 1, f); }
int gasit = 0;
Prelucrarea fișierelor binare organizate secvențial

 Consultare integrală Suprascriere articol vechi


 dispare condiția de selecție
cu cel modificat
 Actualizare:
 adăugare vezi populare, diferă poziția inițială
 modificare (articol unic / selecție / integrală)
 necesită regăsirea articolului de modificat  consultare
 după regăsire: confirmare (dacă e cazul), modificare în memorie, rescriere

 ștergere nu este definită (simulare)


 copierea tuturor articolelor care nu trebuie șterse în alt fișier
 ștergerea fișierului inițial și redenumirea celui nou
Prelucrarea fișierelor binare organizate secvențial

 Temă
◦ Studiați capitolul 2, subcapitolul 2.5 din manual
◦ Studiați subcapitolele 1, 2, 3 din capitolul cu
probleme de prelucrare a fișierelor din culegerea de
probleme
 Capitolul 4 în ediția 2012
 Capitolul 2 în ediția 2015

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