Sunteți pe pagina 1din 3

//CONSULTARE INTEGRALA (FISIER BINAR

SECVENTIAL)
/*Sa se realizeze o listare a tututror articolelor continute de fisierul
rezultat in urma popularii sub forma unui tabel.*/

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

typedef struct{
int nrmatricol;
char CNP[14];
char nume[30];
int nrg;
unsigned char an;
unsigned char note[20];
}STUDENT;
// Se declara structura cu ajutorul careia am populat fisierul binar
pentru care doresc sa fac consultarea integrala.

void main()
{
FILE *f, *g; //Avem nevoie de doua fisiere, unul pentru fisierul binar -
f, si un fisier text unde vom pune lista -g.
char nume[50]; //Numele fisierului din care luam date si pe care il vom
citi de la tastatura (pentru fisierul text vom cit un nume implicit =
lista.txt).
STUDENT x; //Avem nevoie de un articol de tip student.
int nr_crt, i; //Nr curent (in lista articolele sunt numerotate) si un
indice pentru parcurgerea vectorului de note.

//ALGORITM DE PRELUCRARE CU FISIER CONDUCATOR

//Inceput operatii initiale


printf_s("Numele fisierului: ");
gets_s(nume); //Preluam de la tastatura numele fisierului binar ca sir
de caractere.

fopen_s(&f, nume, "rb");


//Deschidem fisierul (Parametrii: adresa fisierului, numele sau extern,
modul de deschidere).

//Verificam succesul operatiei de deschidere.


if (!f)
printf_s("\nFisierul nu poate fi deschis.");
else //Pe aceasta ramura fisierul este sigur deschis.
{
fopen_s(&g, "..\\lista.txt", "wt");
//Deschidem fisierul text (Parametrii: adresa lui g, numele fisier text
(..// - pozitionare in directorul parinte, 1st / schimba tipul
caracterului urmator, 2nd / pastreaza "/" aratand calea, modul de
deschidere).
fprintf_s(g, "Lista studentilor");
//Am scris in fisierul g titlul tabelului/listei (Parametrii: unde scriu
- g, ce scriu "").
fprintf_s(g, "\n\nNrc Nrm. %-30s %13s An Grupa Note","Nume si prenume",
"CNP");
//Am scris in fisierul g capul de tabel (coloanele tabelului, inclusiv
dimensionarea lor) astfel \n\n pentru a lasa un rand liber dupa titlul
tabelului, Nrc - 3 spatii (tot atatea spatii cate caractere are
denumirea coloanei), !!!spatiu intre numele de coloane!!!, Nrm. - 4
caractere, text 30 caractere pentru Nume si Prenume = %30s (aliniat
implicit la dreapta, fortezi alinierea la stanga cu minus (%-30s)), %13s
(nu e nevoie de minus pentru ca CNP-urile au exact 13 caractere si ocupa
toata coloana, An - 2 caractere, Grupa - 5 caractere, Note.
nr_crt = 0; //Cate articole am gasit pana acum? 0 (ZERO)

//Citirea primului articol din fisierul binar.


fread(&x, sizeof(STUDENT), 1, f);
//Sfarsit operatii initiale
while (!feof(f)) //Am reusit sa preluam un articol din fisierul f, nu am
ajuns la sfarsitul fisierului.
{
nr_crt++; //Se incrementeaza numarul curent.
fprintf_s(g, "\n%3d %4d %-30s %13s %2d %5d ",
nr_crt, x.nrmatricol, x.nume, x.CNP, x.an, x.nrg);
//Se scrie pe rand nou prima linie din tabel (primul articol din
fisierul binar) astfel: o valoare numerica de 3 caractere %3d pentru nr
curent s.a.m.d.

//Ce facem cu notele? Nu putem afisa 0, 11, 50, 60, ar fi aberant.


for (i = 0; i < 20;i++)
switch (x.note[i])
{
case 0: fprintf_s(g, "NU "); break;
// 0 - nu exista note inca
case 11:fprintf_s(g, "AB "); break;
// 11 - absent
case 50:fprintf_s(g, "Ad "); break;
// 50 - admis
case 60:fprintf_s(g, "Re "); break;
// 60 - respins
default:fprintf_s(g, "%2d ", x.note[i]);
//Doar notele de la 1 la 10 sunt note valide si sunt setate pe ramura de
default.
}
fread(&x, sizeof(STUDENT), 1, f); //Se citeste urmatorul articol din
fisier si se repeta bucla.
}
fclose(f); //La iesirea din bucla toate articolele din fisierul binar au
fost citite si scrise in fisierul text, putem de sa inchidem fisierele f
si g.
fclose(g);
printf_s("\nLista se afla in fisierul lista.txt"); //Anuntam
utilizatirul ca operatiile s-au finalizat cu succes.
}
printf_s("\nApasa o tasta!"); //Anuntam utilizatorul ca programul s-a
incheiat.
_getch();
}

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