Setul 6

Problema 1 - Citire de la tastatură, scriere în fișier binar și citire fișier binar, afișare pe ecran

Scrieți un program care citește de la tastatură nume de produse și prețuri și le scrie în fișiere binare. Numele de produse pot avea cel mult 255 de caractere și pot conține spații. Prețurile sunt numere reale și vor fi stocate în variabile de tip float. Citirea se încheie când se introduce o linie goală ca și nume de produs. Fiecare pereche de nume și preț se scrie în fișierul binar în următorul format:

    • Un octet păstrează lungimea numelui (să zicem len caractere);

    • Următorii len octeți păstrează codurile ASCII ale literelor din nume;

    • Următorii 4 octeți păstrează prețul (reprezentarea internă a variabilei float în care a fost memorat prețul).

Spre exemplu dacă de la tastatură se introduc două produse: Covrig cu susan la prețul de 2.00 și iPod la prețul de 99.99, atunci fișierul binar va conține:

00000000 0f 43 6f 76 72 69 67 20 63 75 20 73 75 73 61 6e |.Covrig cu susan| 00000010 00 00 00 40 04 69 50 6f 64 e1 fa c7 42 |...@.iPod...B|

Scrieți un alt program care citește din fișierul binar informațiile și afișează pe ecran numele și prețul produselor.

Programul de scriere in fisier

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

FILE *f;

int len;

char s[256];

float pret;

f = fopen("bac.dat", "wb");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului.");

exit(EXIT_FAILURE);

}

do

{

printf("Numele produsului:");fgets(s,255,stdin);

if(strcmp(s,"\n")!=0){

printf("Pretul produsului:");scanf("%f",&pret);

getchar();

printf("\n");

len=strlen(s);

fwrite(&len,1,1,f);

fwrite(s,1,len,f);

fwrite(&pret,sizeof(pret),1,f);

}

}while(strcmp(s,"\n")!=0);

fclose(f);

return 0;

}

Programul de citire din fisier:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

int main()

{

FILE *f;

char c;

f=fopen("bac.dat", "rb");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului.");

exit(EXIT_FAILURE);

}

while (fread(&c, sizeof(c), 1, f)!=0)

printf("%c",c);

fclose(f);

return 0;

}

Programele sunt partial corecte!!

Problema 2 - Afișare nuanțe de gri

Scrieți un program care decodifică imagini simple în nuanțe de gri. Imaginile sunt stocate în fișiere binare. Rezultatul decodificării se afișează pe ecran. O imagine este stocată într-un fișier binar în următorul format:

    • Primii doi octeți stochează o valoare unsigned short care reprezintă lățimea w a imaginii, în pixeli;

    • Următorii doi octeți stochează o valoare unsigned short care reprezintă înălțimea h a imaginii în pixeli;

    • Următorii w*h octeți păstrează culorile pixelilor, câte un octet/pixel, ordonați prin parcurgerea liniilor imaginii de sus în jos și de la stânga la dreapta. O valoare 0 înseamnă culoarea negru. O valoare 255 înseamnă culoarea alb. O valoare între 1 și 254 înseamnă culoarea gri, care este mai întunecată dacă valoarea este mai aproape de 0 și mai deschisă dacă valoarea este mai aproape de 255.

Când desenați imaginea pe ecran folosiți următoarea convenție:

    • Culoarea negru (codul 0) se afișează cu un spațiu;

    • Culoarea alb (codul 255) se afișează cu semnul # (simbolul hash);

    • Culoarea gri întunecat (coduri mai mici sau egale cu 127) se afișează cu semnul . (un punct);

    • Culoarea gri deschis (coduri mai mari decât 127) se afișează cu semnul o (litera 'o' mic).

Spre exemplu fișierul binar cu conținutul:

00000000 06 00 06 00 00 57 57 00 57 57 e3 00 00 ff 00 00 |.....WW.WW......| 00000010 e3 00 00 ff 00 00 00 ff ff 00 ff ff e3 00 00 ff |................| 00000020 00 00 e3 00 00 ff 00 00 |........|

va rezulta în imaginea:

.. .. o # o # ## ## o # o #

Aici găsiți o arhivă cu mai multe fișiere binare pentru test. Pentru fiecare fișier binar găsiți în arhivă și reprezentarea ASCII care ar trebui să rezulte.

rez

Problema 3 - Arhivare

Scrieți un program care permite arhivarea mai multor fișiere într-un fișier binar. Programul trebuie să permită efectuarea următoarelor operații:

    • crearea unei arhive prin specificarea fișierelor care să fie arhivate;

    • listarea numelor fișierelor existente într-o arhivă;

    • extragerea unuia sau mai multor fișiere dintr-o arhivă;

    • adăugarea unuia sau mai multor fișiere la o arhivă existentă;

    • ștergerea unuia sau mai multor fișiere dintr-o arhivă.

Stabiliți un format al fișierului binar care să permită păstrarea pentru fiecare fișier arhivat a numelui fișierului, a dimensiunii și a conținutului.

Implementați toate operațiile descrise mai sus într-un mod cât mai modular, folosind funcții.

Toate numele de fișiere se transmit programului ca și argumente din linia de comandă. Programul va funcționa similar cu programele tar sau zip.

rez