Lucrarea nr



Yüklə 0,56 Mb.
səhifə14/20
tarix17.01.2019
ölçüsü0,56 Mb.
#98835
1   ...   10   11   12   13   14   15   16   17   ...   20

6.2Fişiere binare


În cazul fişierelor binare, parametrul mod al funcţiei fopen() este “rb” pentru citire şi “wb” pentru creare.

Instrucţiunile de scriere şi citire sunt

size_t fwrite(void* buffer, size_t size, size_t nbr, FILE* ptrfile);

size_t fread(void* buffer, size_t size, size_t nbr, FILE* ptrfile);

unde:

buffer – zonă unde se scriu/de unde se citesc date;



size – dimensiunea blocului de date;

nbr – numărul de blocuri de scris/citit;

prtfile – pointer la structura FILE asociată fişierului.

Instrucţiunea fread are ca rezultat numărul de blocuri citite şi zero în caz de eroare sau la întâlnirea sfârşitului de fişier.

Pentru citirea elementelor în ordine aleatoare există posibilitatea de a modifica indicatorul de poziţie al fişierului cu funcţia

int fseek (FILE * stream, long int offset, int whence);

Noua valoare a indicatorului fişierului este obţinută adăugând valoarea offset la poziţia specificată de whence care poate fi

SEEK_SET începutul fişierului

SEEK_CUR poziţia curentă a indicatorului

SEEK_END sfârşitul fişierului

După o instrucţiune fseek, următoarea instrucţiune poate fi o operaţie de citire sau scriere.

Funcţia


long ftell(FILE* stream);

are ca rezultat valoarea indicatorului de poziţie al fişierului.

Instrucţiunile fseek şi ftell pot fi utilizate şi în cazul fişierelor text.
Probleme rezolvate

Problema 1. Să se creeze un fişier binar în care se vor scrie 10 blocuri de câte 15 octeţi fiecare. Blocurile vor conţine caracterele ‘0’, ‘1’, …, ‘9’. Ultimul octet din fiecare bloc va avea valoarea 0. În acest fel fiecare bloc este un şir tip C. Să se citească apoi fişierul creat şi să se listeze pe ecran. Programul ce rezolvă problema este următorul.
#include

int main()

{

FILE * fil;



int i, j;

char x[15];

// deschide fisierul in scriere

fil = fopen("fil.txt", "wb");

for(i = 0; i < 10; i++)

{

for(j = 0; j < 14; ++j)



x[j] = '0' + i ;

x[14] = 0;

fwrite(x, 15, 1, fil);

}

fclose(fil);



// deschide fisierul in citire

fil = fopen("fil.txt", "rb");

int xct;

// citeste un sir

xct = fread(x, 15, 1, fil);

while(xct != 0)

{ // scrie sirul pe ecran (în streamul stdout)

printf("%s\n", x);

// citeste un sir

xct = fread(x, 15, 1, fil);

}

fclose(fil);



return 0;

}
Rezultatele rulării programului sunt cele de mai jos.




6.3Probleme propuse


Problema 1. Să se facă un program care să copieze un fişier tip text în altul. Aceasta se va face citind câte un octet din primul fişier şi scriindu-l în al doilea fişier.

Problema 2. Să se facă un program care să determine dimensiunea în octeţi a unui fişier. Aceasta se va face modificând indicatorul de poziţie al fişierului ca în secvenţa de mai jos.

Indicaţie. Se va modifica programul din problema 3.


FILE* file;

int nb = 0;

// deschide fisierul

// modifica indicatorul de pozitie la sfarsitul fisierului

fseek(file, 0, SEEK_END);

// citeste valoarea indicatorului de pozitie

nb = ftell(file);

Problema 3. Să se facă un program care să determine dimensiunea în octeţi a unui fişier. Se va citi câte o linie din fişier cu funcţia fgets() şi vor număra octeţii din linie.

7Structuri şi uniuni




7.1Structuri


O structură este un tip de date definit de utilizator. O structură este o colecţie de date de tipuri diferite. Datele dintr-o structură sunt numite componente sau câmpuri. O structură se defineşte cu instrucţiunea

struct nume {lista de declaraţii de tip};

unde nume este noul tip de date.

De exemplu, următoarea structură poate defini tipul numere complexe

struct complex {

float real;

float imag;

};

Menţionăm că o structură poate conţine componente de orice tip, chiar şi alte structuri.



Variabilele de tipul unei structuri se definesc cu instrucţiunea

struct nume lista de variabile;

De exemplu, într-un program putem defini numerele complexe a şi b cu instrucţiunea

struct complex a, b;

Adresarea unui element al unei structuri se face cu operatorul “.” cu forma

nume.membru

Putem da valori variabilelor definite anterior astfel:

a.real = 1.0;

a.imag = -1.2 + sin(0.3);

Putem utiliza valorile componentelor unei structuri în expresii, ca de exemplu:

float x;

x = a.real * a.imag;

La fel ca şi în cazul variabilelor putem defini variabile tip pointer la o structură, ce vor conţine adresa unei structuri. Instrucţiunea de definire a unui pointer la o structură are formele

struct nume * identificator;

unde nume este numele structurii. De exemplu,

struct complex * pc;

defineşte un pointer de tip struct complex. Variabila tip pointer poate fi iniţializată ca orice variabilă tip pointer, folosind operatorul de calcul al adresei &

pc = &a;


În cazul unui pointer p la o structură, un câmp al structurii este adresat astfel

(*p).membru

deoarece operatorul . are precedenţă mai mare decât operatorul *.

Prin definiţie, această scriere se prescurtează ca

p->membru

Putem defini un tip de date structură cu instrucţiunea typedef

typedef struct {

// definiţia structurii

} tipnou ;

In acest caz definirea unor variabile de tipul structurii se face mai simplu cu instrucţiunea

tipnou lista de variabile ;

In această lucrare vom scrie programe C pentru lucrul cu structuri şi uniuni.




Yüklə 0,56 Mb.

Dostları ilə paylaş:
1   ...   10   11   12   13   14   15   16   17   ...   20




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©muhaz.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin