Sunteți pe pagina 1din 3

/*

model rezolvare problema cu fisiere relative


*/
#include<stdio.h>
#include<conio.h>

typedef struct{
int is;
int nr_mat;
char nume[30];
int grupa;
char pct_practica[2];//sir de caractere de cel mult 2 elemente
char pct_teme[10]; //vector de 10 elemente de tip char
char pct_exam[2];//sir de caractere de cel mult 2 elemente

} student;

//subprogram pentru determinare numar articole existente in fisier


int nr_articole(FILE *f, int l)
{
long var = ftell(f);//determinare pozitie curenta in fisier
fseek(f,0,2);//repozitionare la sfarsitul fisierului
int n=ftell(f)/l;//determinare numar inregistrari din fisier
fseek(f,var,0);//repozitionare pe var i.e. pozitia curenta in fisier in
momentul in care s-a facut apelul catre subprogra,
return n;

void conversieBinarText( char *numeBin, char *numeText)


{
FILE *f, *g;
student y;

f=fopen (numeBin, "rb");


if (!f) printf ("\n Fisierul %s nu poate fi deschis", numeBin);
else
{
g=fopen (numeText, "w");

if(!g) printf ("\n Fisierul %s nu poate fi deschis", numeText);


else {
//citirea primului articol din fisierul binar
fread (&y,sizeof(student),1,f);
//afisare cap de coloane -- de completat pentru toate campurile
fprintf (g, "Nr mat\t | Nume\t | Examen \t \n");
while (!feof(f))
{
if (y.is == 1) // se verifica daca
exista articol valid
//se afiseaza informatiile
din articolul student - se listeaza tipul de date si lista de campuri din articol
fprintf (g, "%d\t %s\t
%s\t \n", y.nr_mat,y.nume,y.pct_exam);
// se citeste un nou element din
fisier
fread(&y,sizeof(student),1,f);
}
}
}

fclose (f);
fclose (g);
}

void main()
{
FILE *f;
char numeBin[30], numeText[30];
int nr,i,tema;
student x;

printf("Introduceti numele fisierului binar ce il veti realiza:");


fflush(stdin);
gets(numeBin);

f=fopen(numeBin,"wb+");
if (f == NULL)
printf("nu se poate deschide fisierul");
else
{
printf("Introduceti nr de articole pentru preformare:");
scanf("%d", &nr);

//preformare -->>> aceasta etapa de poate elimina si sa se citeasca


direct
// numarul primului articol de inregistrat in fisier urmand ca la
inceputul while-ului
// sa aiba loc operatia de extindere ce include si preformarea atunci
cand nr de elemente din
//fisier este egal cu 0
x.is=0;
for (i=0;i<=nr;i++)
fwrite(&x,sizeof(student),1,f);

//adaugare fisier relativ cu informatii despre studenti

printf("Introduceti nr matricol:");
scanf("%d", &nr);

while(!feof(stdin)) {

int q = nr_articole(f,sizeof(student)); // se determina numarul


de elemente din fisier
if (nr>=q){//daca nr matricol depaseste numarul de elemente din
fisier se face operatie de extindere e.g. introducere articole cu is=0
fseek(f,0,2);//pozitionare la sfarsit
x.is=0;//setare indicator de stare pe 0
for (i=q;i<=nr;i++)
fwrite(&x,sizeof(student),1,f); //adaugare diferenta de
articole cu is=0
}

fseek(f,nr*sizeof(student),0);//pozitionare pe cheia relativa nr


fread(&x,sizeof(student),1,f);//citire articol curent

if (x.is==1)//daca deja exista o valoare inregistrata apare mesaj ca


este duplicat
printf("\nStudentul exista deja");
else
{ //daca is=0 se citesc restul campurilor din articol si la final se
face scrierea in fisier
x.is=1;
x.nr_mat=nr;

printf("\n Introduceti numele studentului:");


fflush(stdin);
gets(x.nume);
printf("\n Introduceti grupa:");
scanf("%d", &x.grupa);
printf("\n Introduceti punctaj practica:");
fflush(stdin);
gets(x.pct_practica);
printf("\n Introduceti punctaj examen:");
fflush(stdin);
gets(x.pct_exam);
for(i=0;i<10;i++)
{
printf("\n Introduceti punctaj tema %d:",i);
scanf("%d", &tema);
x.pct_teme[i]=tema;
}
fseek(f,nr*sizeof(student),0); //pozitionare pe nr
fwrite(&x,sizeof(student),1,f);//scriere articol cu cheia
relativa nr
}

printf("\n Introduceti nr matricol sau ctrl+z:");


scanf("%d", &nr);//se introduce un nou nr matricol sau combinatia ctrl+z
}
}

fclose(f);

printf("Introduceti numele fisierului text in care veti afisa:");


fflush(stdin);
gets(numeText);
conversieBinarText(numeBin,numeText); // apel subprogram de conversie binar-
text
_getch();
}

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