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.
Dostları ilə paylaş: |