Programarea Calculatoarelor, seria CC

Laborator 13

Fişiere binare. Compilarea din mai multe surse

În acest laborator veţi învăţa să:



Funcţii de citire şi scriere la nivel de octet:

Pentru citire la nivel de octet se foloseşte funcţia fread() definită în headerul <stdio.h>, care are următoarea sintaxă:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

Semnificaţia argumentelor este următoarea:


Pentru scriere la nivel de octet se foloseşte funcţia fwrite() definită în headerul <stdio.h>, care are următoarea sintaxă:

size_t fwrite ( void * ptr, size_t size, size_t count, FILE * stream );

Semnificaţia argumentelor este următoarea:


În aplicaţiile mari, în mod normal modulele diferite de program se implementează în fişiere separate, urmând a fi necesară compilarea executabilului final din mai multe surse. Includerea unui fişier sursă în alt fişier sursă se face cu ajutorul directivei de preprocesare # include care este urmată de numele fişierului ce trebuie inclus. Distingem două cazuri:

Trebuie să mai specificăm aici următoarea problemă. Este posibil să implementăm de exemplu definiţia unei structuri de date într-un fişier header, şi apoi să scriem în fişiere separate funcţii ce operează pe acea structură de date. Evident, funcţiile definite vor trebui să includă la rândul lor fişierul de definire al structurii de date. Dar fişierul care conţine funcţia main(), de exemplu, trebuie să includă toate fişierele care implementează funcţii, ceea ce ar însemna că fişierul de definire al structurii de date este inclus de mai multe ori. Acest lucru trebuie întotdeauna evitat prin protejarea clauzelor de includere astfel:

#ifndef __STDLIB__
#define __STDLIB__

#include <stdlib.h>

#endif /* __STDLIB__ */

Înainte de a se include pentru prima dată <stdlib.h>, numele __STDLIB__ nu este definit, ceea ce permite includerea headerului. Încercările ulterioare de a include fişierul header vor eşua (ne dorim acest lucru deoarece per ansamblu nu dorim să includem headerul decât o singură dată în program).


Problema1.

Să se definească o structură cu următoarele date despre un produs:

Să se scrie un program care poate efectua următoarele operaţii cu un fişier binar de articole de tipul produs (numele fişierului se dă ca argument în linia de comandă!):

ATENŢIE! Definiţia tipului de date, includerea bibliotecilor precum şi antetele funcţiilor care se vor defini ulterior vor fi grupate într-un fişier header!


Problema 2.

Funcție pentru crearea unui fişier binar care să conţină 100 de produse cu date generate aleator astfel:

În fişier se va scrie câte un articol întreg cu ajutorul funcţiei fread() (nu pe componente).

Observaţii:


Problema 3.

Funcție pentru afişarea fişierului creat anterior, câte un articol pe o linie.


Problema 4.

Funcție pentru sortarea articolelor din fişier crescător după nume.

Atenţie! În urma rulării acestei funcţii, se va suprascrie conţinutul fişierului.
Atenţie! Pentru sortare se va folosi funcţia qsort() din headerul <stdlib.h>


Problema 5.

Funcție pentru sortarea articolelor din fişier descrescător după preţ.

Atenţie! În urma rulării acestei funcţii, se va suprascrie conţinutul fişierului.
Atenţie! Pentru sortare se va folosi funcţia qsort() din headerul <stdlib.h>


Problema 6.

Funcție pentru adăugarea la fişier a unui nou articol cu datele obţinute dintr-un număr X citit de la tastatură.


Problema 7.

Funcție pentru citirea unui număr întreg X de la consolă, căutarea produsului cu nume ProdusX şi afişarea datelor despre produsul găsit. După afişare se poate introduce o linie cu alte valori pentru cele 3 câmpuri, care vor înlocui in fişier valorile afişate (o linie goală nu modifică nimic în fişier).

Dacă nu există un produs cu acel nume atunci se afişează un mesaj corespunzător.

Atenţie! Pentru căutare se va folosi funcţia bsearch() din headerul <stdlib.h>


Problema 8.

După testarea fiecăreia din cele 6 operaţii se va rescrie programul principal astfel încat operaţia să fie dată de unul din argumentele următoare date în linie de comandă:

Programul primeşte în linia de comandă operaţia şi numele fişierului!