Sunteți pe pagina 1din 13

E.

Kalisz - Programarea calculatoarelor

-- 13. 1 --

Fiiere binare (de articole)


informaia pstrat este "imagine memorie" la citire/scriere se efectueaz transfer de octei, nefiind necesare conversii de reprezentare sunt evitate erorile de conversie transferul este mai rapid este posibil accesul direct la o informaie pot fi efectuate modificri ale coninutului de regul fiierele binare au dimensiune mai mic dect fiierele text cu acelai coninut pentru vizualizarea coninutului este necesar o conversie adecvat

E.Kalisz - Programarea calculatoarelor

-- 13. 2 --

Deschiderea fiierelor binare


FILE* fopen(char* nume_fisier, const char* mod_lucru); unde mod_lucru poate fi - n cazul crerii unui fiier nou wb pentru scriere w+b pentru scriere i citire - n cazul prelucrrii unui fiier existent rb pentru citire r+b pentru citire i modificare ab pentru adugare (scriere la sfrit) a+b pentru adugare i modificare

E.Kalisz - Programarea calculatoarelor

-- 13. 3 --

Funcii de citire / scriere


size_t fread (void* a, size_t d, size_t n, FILE* f); size_t fwrite(const void* a, size_t d, size_t n, FILE* f); Rezultat: numrul de elemente transferate (net n)

cursor fisier
n elemente de cate d octeti

fwrite ...... fread


d octeti net*d octeti transferati (net n)

E.Kalisz - Programarea calculatoarelor

-- 13. 4 --

Salvare numr elemente i elemente vector


double x[25]; size_t nx, net; . . . . net = fwrite(&nx, sizeof(size_t), 1, f); if (net == 1) /* operatia a reusit */ { net = fwrite(x, sizeof(double), nx, f); . . . . Alte variante de scriere a elementelor din vector: octet cu octet net = fwrite(x, 1, sizeof(double)* nx, f); n bloc net = fwrite(x, sizeof(double)* nx, 1, f);

E.Kalisz - Programarea calculatoarelor

-- 13. 5 --

Funcii de localizare
/* aflarea pozitiei curente; se utilizeaza atunci cand se intentioneaza sa se revina in punctul respectiv */ long ftell(FILE* f); Rezultat: Rezultat distana n octei fa de nceputul fiierului sau -1 n caz de eroare /* pozitionare pe octetul aflat la distanta d fata de referinta: 0 - inceput, 1 - cursor, 2 - sfarsit */ int fseek(FILE* f, long d, int ref); Rezultat: Rezultat 0 n caz de reuit, != 0 n caz de eroare

E.Kalisz - Programarea calculatoarelor

-- 13. 6 --

Modificarea unei informaii


. . . . TInfo w; ..... long dist; . . . . fseek dist = ftell(f); fread(&w, sizeof(TInfo), 1, f); /* prelucrarea informatiei citite */ . . . . /* revenire si actualizare (rescriere) */ fseek(f, dist, 0); fwrite(&w, sizeof(TInfo), 1, f);
cursor fisier fread, fw rite

E.Kalisz - Programarea calculatoarelor

-- 13. 7 --

Aflarea dimensiunii fiierului


. . . . long ntot, ne; . . . . /* pozitionare la sfarsitul fisierului */ fseek(f, 0, 2); /* afla distanta fata de inceput */ ntot = ftell(f); . . . . Daca fiierul conine numai elemente de tip Txx, atunci numrul lor este ntot/sizeof(Txx)

E.Kalisz - Programarea calculatoarelor

-- 13. 8 --

Transferul unui ir de caractere


a. Memorat numai cu terminator scriere net = fwrite(s, strlen(s)+1, 1, f); sau net = fwrite(s, 1, strlen(s)+1, f); citire caracter cu caracter, pn la terminator p = s; do { net = fread(p, 1, 1, f); if(net != 1) /* citire esuata */ { *(p++) = '\0'; break;} } while (*(p++) != '\0'); net = p - s;

E.Kalisz - Programarea calculatoarelor

-- 13. 9 --

Transferul unui ir de caractere


b. Memorat fr terminator, terminator dar precedat de lungime scriere lgs = strlen(s); net = fwrite(&lgs, sizeof(int), 1, f); if (net == 1) { net = fwrite(s, lgs, 1, f); . . . . citire net = fread(&lgs, sizeof(int), 1, f); if (net == 1) { net = fread(s, lgs, 1, f); s[lgs] = '\0'; /* adauga terminator */ . . . .

E.Kalisz - Programarea calculatoarelor

-- 13. 10 --

Salvarea informaiilor care conin pointeri


La transferul ntr-un fiier binar pointerii i pierd semnifica semnificaia trebuie nlocuii prin informaii semnificative n cadrul fiierului. Fie tipul typedef struct { char *nume, *prenume, cnp[14]; int *note; } TStudd;
n octeti p octeti

nume prenume cnp xxxx\0 note

\0

\0

nrn note

E.Kalisz - Programarea calculatoarelor

-- 13. 11 --

Salvarea informaiilor care conin pointeri


n cazul salvrii ntr-un fiier binar a informaiilor despre un grup de studeni, care au acelai numr de note (nm), acesta va fi memorat o singur dat, la nceputul fiierului. Deoarece numele i prenumele studenilor au lungimi diferite, pentru a permite citirea n bloc a irurilor respective este util salvarea lungimii fiecrui nume i prenume (n i p).
Fisierul binar
nrn ... n p nume \0 prenume \0 cnp (n+p) octeti informatii despre un student nrn note ....

E.Kalisz - Programarea calculatoarelor

-- 13. 12 --

Salvarea informaiilor despre studeni


S considerm cazul salvrii ntr-un fiier binar a informaiilor referitoare la studeni, avnd surse diferite. Funcia de salvare va transfera n fiier informaiile despre un singur student, preluate de la o adres dat ca parametru. Elementele comune tuturor transferurilor sunt fiierul destinaie (f) numrul de note (nrn) Din acest motiv ele vor fi transmise ca parametri o singur dat, ntr-un apel de iniializare a scrierii n fiier funcia va avea numr variabil de parametri.

E.Kalisz - Programarea calculatoarelor

-- 13. 13 --

Salvarea informaiilor despre studeni


Prototipul funciei: int SalvStud(TStudd *a, ...); Rezultat: Rezultat 0 dac operaia s-a executat corect != 0 dac s-a produs o eroare Variante de apel: apel pentru iniializare r = SalvStud(NULL, f, nrn); pentru transferul informaiilor despre un student, aflate la adresa ps r = SalvStud(ps);

E.Kalisz - Programarea calculatoarelor

-- 13. 14 --

Salvarea informaiilor despre studeni


int SalvStud(TStudd *a, ...) { va_list ap; static FILE* f = NULL; static int nrn = 0, ton = 0; int lnp[2], r; /* lg.nume si prenume, rezultat */ if (!a) /* initializare f si nrn */ { va_start(ap, a); f = va_arg(ap, FILE*); nrn = va_arg(ap, int); /* nr.note */ ton = nrn * sizeof(int);/* total octeti note */ va_end(ap); /* scriere nrn in fisier */ r = fwrite(&nrn, sizeof(int), 1, f); if (r != 1) return -1; return 0; }

E.Kalisz - Programarea calculatoarelor

-- 13. 15 --

Salvarea informaiilor despre studeni


/* transfer informatii student: 1. lungimi nume si prenume 2. nume + prenume 3. codul numeric personal 4. notele */ lnp[0] = strlen(a->nume) + 1; lnp[1] = strlen(a->prenume) + 1; r = fwrite(lnp, sizeof(lnp[0])*2, 1, f); if (r != 1) return -1; r = fwrite(a->nume, lnp[0]+lnp[1], 1, f); if (r != 1) return -2; r = fwrite(&(a->cnp), 14, 1, f); if (r != 1) return -3; r = fwrite(a->note, ton, 1, f); return (r == 1 ? 0 : -4); }

E.Kalisz - Programarea calculatoarelor

-- 13. 16 --

Afiare nume i prenume citite din fiier


int AfiNP(FILE* f) { int lnp[2], r;/* lg.nume si prenume, rezultat */ char t[81]; /* zona tampon */ r = fread(lnp, sizeof(lnp[0])*2, 1, f); if (r != 1) return -1; r = fread(t, lnp[0], 1, f); /* nume */ if (r != 1) return -2; printf("%s ", t); r = fread(t, lnp[1], 1, f); /* prenume */ if (r != 1) return -3; printf("%s\n", t); return 0; }

E.Kalisz - Programarea calculatoarelor

-- 13. 17 --

Afiarea tuturor numelor i prenumelor [1]


int nrn, i; long ntot, salt; . . . . fseek(f, 0, 2); ntot = ftell(f); /* lungime fisier */ rewind(f); r = fread(&nrn, sizeof(int), 1, f); if (r != 1) { puts("Eroare la citire nrn"); getch(); return -1; } /* calcul numar octeti memorare note */ salt = nrn * sizeof(int) + 14;

E.Kalisz - Programarea calculatoarelor

-- 13. 18 --

Afiarea tuturor numelor i prenumelor [2]


printf("Numele si prenumele studentilor:\n"); for (i = 0; ftell(f) < ntot; i++) { if (AfitNP(f) < 0) break; /* pozitionare dupa grup note*/ fseek(f, salt, 1); } if (ftell(f) < ntot) printf("Eroare la citirea %i\n", i+1); . . . .

E.Kalisz - Programarea calculatoarelor

-- 13. 19 --

Parametri n linia de comand


Multe programe pot fi sau trebuie apelate cu parametri n linia de comand comand (cea prin care se cere lansarea n execuie). De exemplu, un program de copiere sau conversie a formatului unui fiier text are ca parametri identificatorii fiierelor surs i destinaie. Acetia pot fi specificai: a. ca rspunsuri la cererile programului copiere Numele fisierului sursa: s.txt Numele fisierului destinatie: r.txt b. n linia de comand (parametrii din linia de comand se separ prin caractere spaiu sau TAB) copiere s.txt r.txt

E.Kalisz - Programarea calculatoarelor

-- 13. 20 --

Parametri n linia de comand


n cazul n care se dorete utilizarea de parametri n linia de comand, functia main trebuie definit astfel: int main (int argc, char *argv[]) { . . . . } unde argc memoreaz numrul de parametri argv vectorul adreselor irurilor parametru. Parametrul cu indice [0] este adresa irului care identific programul (<cale>nume.exe).

argv

argument 0 \0

argument 1

\0

E.Kalisz - Programarea calculatoarelor

-- 13. 21 --

Parametri n linia de comand


Exemplu de prelucrare a parametrilor din linia de comand: for (i = 0; i < argc; i++) { printf("[%i]:%s\n", i, argv[i]); } Variante de execuie cu parametri n linia de comand: - dac se utilizeaz Dev-C++, atunci parametrii din linia de comand trebuie specificai nainte de lansarea n execuie a programului, folosind opiunile Execute > Parameters - execuie Windows se folosesc opiunile Start > Run specificnd ca prim parametru calea complet pentru programul lansat n execuie.

E.Kalisz - Programarea calculatoarelor

-- 13. 22 --

Parametri n linia de comand

E.Kalisz - Programarea calculatoarelor

-- 13. 23 --

Parametri n linia de comand

E.Kalisz - Programarea calculatoarelor

-- 13. 24 --

Parametri n linia de comand


S considerm un program care poate prelua din linia de comand numele unui fi fiier surs surs i al unui fi fiier destina destinaie, ie dar dac aceti parametri nu sunt specificai, cere explicit introducerea lor de la consol. Prin urmare n linia de comanda pot aprea, n afar identificatorului programului, 0, 1 sau 2 nume de fiier, ca n urmtoarele exemple de apel: a. xxx b. xxx x1.dat c. xxx x1.dat x1.rez Rezult c programul trebuie s aloce spaiu pentru memorarea numelor citite de la consol i s stabileasc adresa corect a fiecrui nume de fiier adresa de parametru din linia de comand (cazul implicit) sau adresa la care se gsete numele citit.

E.Kalisz - Programarea calculatoarelor

-- 13. 25 --

Parametri n linia de comand


a. Se citesc numele fisierelor sursa si destinatie b. Se citeste numai numele fisierului destinatie (numele sursa = parametru)
numes sursa
numeCitit
\0

numed dest

numeCitit

\0

numed sursa
parametru 0 \0 parametru 1

numeCitit

\0

dest
\0

sursa c. Ambele nume apar ca parametri in linia de comanda parametru 0

dest
\0 parametru 1 \0 parametru 2 \0

E.Kalisz - Programarea calculatoarelor

-- 13. 26 --

Parametri n linia de comand


int main (int argc, char *argv[]) { FILE *fs, *fd; char numes[21], numed[21], /* spatiu citire */ *sursa = argv[1], *dest = argv[2]; /* adr.nume */ . . . . . . . . switch (argc) { case 1: /* se citesc nume sursa si destinatie */ sursa = numes; printf("Nume fisier sursa: "); fflush(stdin); scanf("%s", numes); case 2: /* se citeste numele destinatiei */ dest = numed; printf("Nume fisier destinatie: "); fflush(stdin); scanf("%s", numed); } . . . . . . .

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