Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




PRELUCRAREA FISIERELOR

c


PRELUCRAREA FIsIERELOR

10.1. FIsIERE

În general, prin fisier întelegem o colectie ordonata de elemente numite înregistrari, care sunt pastrate pe diferite suporturi de memorie externa. Suportul de memorie externa cel mai folosit este suportul magnetic (de obicei discuri sub forma de flopy si hardiscuri sau banda magnetica care e din ce în ce mai rar folosita). Suportul magnetic este reutilizabil deoarece zona utilizata pentru a pastra înregistrarile unui fisier poate fi ulterior reutilizata pentru a pastra înregistrarile altui fisier.



Datele introduse de la un terminal se considera ca formeaza un fisier de intrare. Înregistrarea în acest caz, de obicei, este formata din datele tastate la terminal pe un rând deci caracterul de rând nou (newline) este terminator de înregistrare. În mod analog, datele care se afiseaza pe terminal formeaza un fisier de iesire. Înregistrarea poate fi formata din caracterele unui rând.

Un fisier are o înregistrare care marcheaza sfârsitul de fisier. În cazul fisierelor de intrare de la tastatura sfârsitul de fisier se genereaza prin:

CTRL/Z

El poate fi pus în evidenta folosind constanta simbolica EOF definita în fisierul stdio.h.

Prelucrarea fisierelor implica un numar de operatii specifice acestora. Doua o 121h73b peratii sunt absolut necesare la prelucrarea oricarui fisier:

deschiderea fisierului;

închiderea fisierului.

Aceste operatii de deschidere si închidere a unui fisier se pot realiza prin intermediul unor functii speciale din biblioteca standard a limbajului C. Alte operatii privind prelucrarea fisierelor sunt:

crearea unui fisier;

consultarea unui fisier;

actualizarea unui fisier;

adaugarea de înregistrari într-un fisier;

pozitionarea într-un fisier;

stergerea unui fisier.

Prelucrarea fisierelor se poate face la doua nivele. Primul nivel face apel direct la sistemul de operare si se numeste nivelul inferior de prelucrare al fisierelor. Cel de-al doilea nivel de prelucrare se realizeaza prin utilizarea unor proceduri specializate în prelucrarea fisierelor care, printre altele, pot rezerva si gestiona automat zone tampon necesare realizarii operatiilor de intrare/iesire, si se numeste nivelul superior de prelucrare al fisierelor

10.2. NIVELUL INFERIOR DE PRELUCRARE AL FIsIERELOR

La acest nivel de prelucrare se folosesc 5 functii:

open (creat)- pentru deschiderea fisierelor;

read - pentru citirea din fisier;

write - pentru citirea din fisier;

lseek - pentru pozitionarea în fisier;

close - pentru închiderea fisierului.

10.2.1. Deschiderea unui fisier

Orice fisier înainte de a fi prelucrat trebuie deschis. Aceasta operatie se realizeaza prin intermediul functiei open al carui prototip este urmatorul:

int open (const char *cale, int acces);

unde:

cale este un pointer spre un sir de caractere care defineste calea spre fisierul care se deschide (în cea mai simpla forma este numele fisierului daca se afla în directorul curent)

acces este o variabila de tip întreg care poate lua una din valorile:

- O_RDONLY - fisierul se deschide numai în citire (consultare);

- O_WRONLY - fisierul se deschide numai în scriere (creare);

(sau O_CREAT)

- O_RDWR - fisierul se deschide în citire/scriere;

- O_APPEND - fisierul se deschide la sfârsit pentru adaugare;

- O_BINARY - fisierul se prelucreaza binar;

- O_TEXT - fisierul este de tip text.

Unele valori din cele de mai sus se pot combina cu ajutorul operatorului |. De exemplu O_RDWR | O_BINARY pentru deschiderea fisierului în scriere/citire binara.

Observatii:

1o. Functia open întoarce descriptorul de fisier care este o valoare intreaga ce va identifica fisierul în toate celelate operatii care se vor realiza asupra lui. Daca deschiderea unui fisier nu reuseste (de obicei unul din parametrii este eronat) atunci functia open returneaza valoarea -1.

2o. Pentru a putea utiliza functia open trebuie incluse fisierele header io.h si fcntl.h.

3o. Pentru a crea un fisier nou se va folosi functia creat în locul functiei open cu prototipul:

int creat (const char *cale, int mod);

unde:

- cale are aceeasi semnificatie ca si la functia open;

- mod este un întreg care poate fi definit prin constantele simbolice de mai jos:

S_IREAD - se poate citi fisierul;

S_IWRITE - se poate scrie în fisier;

S_IEXEC - se poate executa programul continut în fisier.

Utilizarea functiei presupune includerea fisierelor io.h si stat.h

4o. Implicit fisierul se considera ca este de tip text.

Exemple:

char nume_fisier[ ]="fis1.dat";

int df;

df = open (nume_fisier, O_RDONLY);

Prin apelul de mai sus se deschide în citire fisierul fis1.dat din directorul curent.

int df;

df = open ("c:\\borlandc\\help.txt",O_APPEND);

Se deschide în adaugare fisierul help.txt din directorul borlandc de pe discul C.

10.2.2. Citirea dintr-un fisier (consultare)

Functia folosita pentru operatia de citire dintr-un fisier în memorie se numeste read si are prototipul urmator:

int read (int df, void *buf, unsigned lung);

unde:

- df este descriptorul de fisier a carui valoare a fost definita la deschidere;

buf este pointerul spre zona de memorie în care se receptioneaza înregistrarea care se citeste;

lung este lungimea în octeti a inregistrarii citite.

Observatii:

1o. La fiecare apel functia returneaza înregistrarea curenta. La primul apel se citeste prima înregistrare din fisier, la al doilea apel se citeste a doua, etc. Ordinea înregistrarilor în fisier este cea definita la crearea fisierului.

2o. La un apel al functiei read se citesc cel mult lung octeti înregistrarea având definita lungimea la scrierea în fisier. Functia reîntoarce numarul de octeti cititi, 0(zero) la sfârsit de fisier, sau -1 la eroare. De obicei se folosesc frecvent înregistrari de 512 octeti sau chiar mai mari.

3o. Functia read poate fi folosita pentru a citi de la intrarea standard. În acest caz, descriptorul de fisier este 0 (stdin are 0, stdout are 1, stderr are 2 stdprn are 3 stdaux are 4). Programatorul nu trebuie sa deschida fisierele standard deoarece ele sunt deschise automat la lansarea în executie a programului.

4o. Utilizarea functiei read, presupune includerea fisierului io.h.

10.2.3. Scrierea într-un fisier (creare, actualizare, adaugare)

Pentru a scrie într-un fisier se foloseste functia write. Se presupune ca fisierul este deschis în prealabil prin functia creat sau open. Ea este asemanatoare cu functia read, doar ca realizeaza transferul invers, adica din memorie în fisier si are prototipul:

int write (int df, void *buf, unsigned lung);

Observatii:

1o. Functia returneaza numarul octetilor scrisi în fisier. Acesta este egal cu lung si defineste lungimea înregistrarii scrise în fisier. În cazul în care numarul returnat de functia write difera de parametrul lung scrierea a fost eronata si se reîntoarce valoarea -1.

2o. Utilizarea functiei write implica includerea fisierlui io.h.

10.2.4. Pozitionarea într-un fisier

Pentru a avea acces aleator la înregistrarile unui fisier se foloseste o functie de pozitionare în fisier pe anumite înregistrari dorite. Pe fisierele care au suporturi magnetice este posibila pozitionarea cu ajutorul functiei lseek care are prototipul urmator:

long lseek (int df, long deplasament, int origine)

unde:

df este descriptorul de fisier;

deplasament defineste numarul de octeti peste care se va deplasa capul de

scriere/citire al discului;

origine are una din valorile:

0 deplasamentul se considera de la începutul fisierului;

1 deplasamentul se considera din pozitia curenta a capului de

scriere/citire;

2 deplasamentul se considera de la sfârsitul fisierului.

Observatii:

1o. Functia returneaza pozitia capului de citire/scriere fata de începutul fisierului în numar de octeti sau -1L la eroare.

2o. Functia nu realizeaza nici un transfer de informatie ci doar pozitioneaza capul de citire/scriere în fisier. Deci pentru transfer e nevoie de functiile read sau write.

3o. Utilizarea functiei presupune includerea fisierului io.h.

4o. Apelul lseek (df, 0L, 0) permite o pozitionare la început de fisier

iar apelul lseek (df, 0L, 2) permite o pozitionare la sfârsit de fisier.

10.2.5. Închiderea unui fisier

La sfârsitul prelucrarii unui fisier acesta trebuie închis. Acest lucru se realizeaza automat daca programul se termina prin apelul functiei exit. Programatorul poate închide un fisier folosind functia close. Se recomanda închiderea unui fisier de îndata ce s-a terminat prelucrarea lui. Aceasta din cauza ca numarul fisierelor ce pot fi deschise simultan este limitat. Limita este dependenta de sistemul de operare si ea variaza, de obicei, în intervalul 15-25. De obicei numarul de buffere (zone tampon) asociate fisierelor se precizeaza în fisierul autoexec.bat. Mentionam ca fisierele standard din limbajul C nu se închid de programator.

Functia close are prototipul urmator:

int close (int df);

unde

df este descriptorul fisierului care se închide.

Observatii:

1o. La o închidere normala, functia returneaza valoarea 0 si -1 în caz de incident.

2o. Utilizarea functiei close implica includerea fisierului io.h.

Exemple

Vom deschide fisierul "fis1.dat" în creare si vom scrie în el doua înregistrari.

#include<io.h>

#include<fcntl.h>

void main (void)

else printf ("nu s-a deschis fisierul);

close (df); // se inchide fisierul

Se afiseaza continutul fisierului "fis1.dat"

#include<io.h>

#include<fcntl.h>

#include <stdio.h>

#include <conio.h>

void main (void)

else printf ("nu s-a deschis fisierul);

close (df);

getch(); // se asteapta un caracter de la tastatura

programul urmator copiaza intrarea standard la iesierea standard folosind o zona tampon de 80 de caractere:

#define LZT 80

#include <io.h>

void main (void) // copiaza intrarea standard la iesirea standard

10.3. NIVELUL SUPERIOR DE PRELUCRARE A FIsIERELOR

Dupa cum am amintit, la acest nivel fisierele se prelucreaza cu ajutorul unor proceduri specializate.

Deschiderea unui fisier

Functia fopen se utilizeaza pentru deschiderea unui fisier. Ea returneaza un pointer spre tipul FILE (tipul fisier), tip definit în fisierul stdio.h. Tipul FILE este un tip structurat si el depinde de sistemul de operare. În caz de eroare, functia fopen returneaza pointerul NULL. Prototipul functiei fopen este urmatorul:

FILE *fopen (const char *cale, const char *mod);

unde:

cale are aceeasi semnificatie ca si în cazul functiilor open si creat.

mod este un pointer spre un sir de caractere care defineste modul de prelucrare al fisierului dupa deschidere. Acest sir de caractere se defineste în felul urmator:

- "r" - deschidere în citire (read);

- "w" - deschidere în scriere (write);

- "a" - deschidere pentru adaugare;

- "r+" - deschidere pentru modificare (citire sau scriere);

- "rb" - citire binara;

- "wb" - scriere binara;

- "r+b" - citire/scriere binara.

Observatii:

1o. Daca se deschide un fisier inexistent cu modul "w" sau "a", atunci el este deschis în creare.

2o. Daca se deschide un fisier existent cu modul "w", atunci continutul vechi al fisierului se pierde si se va crea unul nou cu acelasi nume.

3o. Mentionam ca, stdin, stdout, stderr, stdaux si stdprn sunt pointeri spre tipul FILE si permit ca functiile de nivel superior de prelucrare a fisierelor sa poata trata intrarea standard si iesirile standard pe terminal si imprimanta la fel ca si fisierele pe celelalte suporturi. Singura deosebire consta în aceea ca aceste fisiere nu se deschid si nici nu se închid de catre programator. Ele sunt deschise automat la lansarea în executie a programului si se închid la apelul functiei exit.

4o. Apelul functiei se realizeaza prin constructia:

FILE *pf;

pf = fopen ("FIS1.DAT","w");

10.3.2. Prelucrarea pe caractere a unui fisier

Fisierele pot fi scrise si citite caracter cu caracter, folosind doua functii simple:

putc pentru scriere;

getc pentru citire.

Functia putc are prototipul:

int putc (int c, FILE *pf);

unde:

c este codul ASCII al caracterului care se scrie în fisier;

pf este pointerul spre tipul FILE a carui valoare a fost returnata de functia fopen la deschiderea fisierului în care se scrie; pf poate fi si stdout, sdterr, stdaux, stdprn.

Functia putc returneaza valoarea lui c respectiv -1 în caz de eroare.

Functia getc are prototipul:

int getc (FILE *pf);

unde:

pf este pointerul spre tipul FILE a carui valoare a fost returnata de functia fopen la deschiderea fisierului; în particular pf poate fi stdin.

Functia getc returneaza codul ASCII al caracterului citit sau EOF la sfârsit de fisier sau eroare.

Închiderea unui fisier

Închiderea unui fisier se realizeaza cu ajutorul functiei fclose care are prototipul:

int fclose (FILE *pf);

unde:

pf este pointerul spre tipul FILE a carui valoare a fost definita la deschiderea fisierului prin intermediul functiei fopen.

Functia fclose returneaza:

0 la închiderea normala a fisierului;

1 în caz de eroare.

Exemple:

Programul urmator copiaza intrarea standard la iesirea standard stdout, folosind functiile getc si putc.

#include <stdio.h>

void main (void)

Programul urmator copiaza intrarea standard la imprimanta.

#include <stdio.h>

void main (void)

Programul urmator scrie la iesirea stdout caracterele unui fisier a carui cale este argumentul din linia de comanda. Daca nu exista un argument în linia de comanda, atunci se citeste de la intrarea standard.

#include <stdio.h>

void main (int argc, char *argv[ ] )

while (( c = getc (pf)) != EOF) putchar(c);

exit (0);

}

Operatiile de intrare-iesire cu format

Biblioteca standard a limbajului C contine functii care permit realizarea operatiilor de intrare/iesire cu format. Astfel se pot utiliza functiile fscanf si fprintf, prima pentru citire cu format dintr-un fisier, iar a doua pentru scriere cu format într-un fisier.

Functia fscanf este asemanatoare cu functia scanf. Ea are un parametru în plus fata de scanf. Acest parametru este un pointer spre tipul FILE si el defineste fisierul din care se face citirea. Acest pointer este primul parametru al functiei fscanf. Functia poate fi apelata printr-o expresie de atribuire de forma:

nr = fscanf (pf, control, lista_de_parametrii );

unde :

pf este un pointer spre tipul FILE si valoarea lui a fost definita prin apelul functiei fopen; defineste fisierul din care se face citirea;

ceilalti parametri sunt identici cu cei utilizati la apelul functiei scanf.

Functia fscanf, ca si functia scanf, returneaza numarul câmpurilor citite din fisier. La întâlnirea sfârsitului de fisier se returneaza valoarea EOF definita în fisierul stdio.h. Pentru pf = stdin, functia fscanf este identica cu scanf.

Functia fprintf , ca si functia printf, returneaza numarul caracterelor scrise în fisier sau -1 în caz de eroare. Pentru pf = stdout, functia fprintf este identica cu printf. De asemenea, se pot utiliza pointerii standard obisnuiti: stderr, stdaux, stdprn.

Exemplu:

Vom scrie un program cu ajutorul caruia se va crea un fisier cu numele "FIS.DAT" si care contine înregistrari cu numele, prenumele si adresa unor persoane.

#include <stdio.h>

void main(void)

do

while (i<=n);

fclose(pf);

10.3. 5. Intrari-iesiri de siruri de caractere

Biblioteca standard a limbajului C contine functiile fgets si fputs care permit citirea respectiv scrierea într-un fisier ale carui înregistrari sunt siruri de caractere.

Functia fgets are prototipul:

char *fgets (char *s, int n, FILE *pf);

unde:

s este pointerul spre zona în care se face citirea caracterelor;

n-1 este numarul maxim de caractere care se citesc;

pf este pointerul spre tipul FILE care defineste fisierul din care se face citirea.

De obicei s este numele unui tablou de tip char de dimensiune cel putin n. sirul se termina cu '\0' (caracterul NUL). La întâlnirea caracterului '\n', citirea se opreste. În acest caz, în zona receptoare se transfera caracterul '\n' si apoi caracterul NUL ('\0').

În mod normal, functia returneaza valoarea pointerului s. La întâlnirea sfârsitului de fisier se returneaza valoarea NULL.

Functia fputs scrie într-un fisier un sir de caractere care se termina prin '\0'. Ea are prototipul:

int fputs (const char *s, FILE *pf);

unde:

s este pointerul spre zona care contine sirul de caractere care se scrie;

pf este pointerul spre zona care contine sirul de caractere care se scrie.

Functia fputs returneaza codul ASCII al ultimului caracter scris sau -1 în caz de eroare.

Aceste functii sunt realizate folosind functia getc pentru fgets si putc pentru fputs.

Pentru a citi de la intrarea standard stdin, se poate folosi functia gets, care nu mai are parametrii pf si n. Parametrul pf este implicit stdin. Functia gets citeste caracterele de la intrarea standard pâna la întâlnirea caracterului '\n' care nu mai este pastrat în zona spre care pointeaza s. sirul de caractere citit se termina si în acest caz prin '\0'.

În mod analog, pentru a scrie la iesirea standard stdout se poate folosi functia puts, care nu mai are parametrul pf, acesta fiind implicit stdout. În rest, functia puts este la fel ca si functia fputs.

10.3.6. Pozitionarea într-un fisier

Cu ajutorul functiei fseek se poate deplasa capul de citire/scriere al discului în vederea prelucrarii înregistrarilor fisierului într-o ordine oarecare, diferita de cea secventiala (acces aleator). Aceasta functie este asemanatoare cu functia lseek. Ea are prototipul urmator:

int fseek (FILE *pf, long deplasament, int origine);

unde:

pf este pointerul spre tipul FILE care defineste fisierul în care se face pozitionarea capului de citire/scriere;

deplasament si origine au aceeasi semnificatie ca si în cazul functiei lseek.

Functia fseek returneaza valoarea zero la pozitionare corecta si o valoare diferita de zero în caz de eroare.

Functia ftell indica pozitia capului de citire în fisier. Ea are prototipul:

long ftell (FILE *pf);

unde:

pf este pointerul spre tipul FILE care defineste fisierul în cauza.

Functia returneaza o valoare de tip long care defineste pozitia curenta a capului de citire/scriere, si anume reprezinta deplasamentul în octeti a pozitiei capului fata de începutul fisierului.

10.3.7. Prelucrarea fisierelor binare

Fisierele organizate ca date binare (octetii nu sunt considerati ca fiind coduri de caractere) pot fi prelucrate la acest nivel folosind functiile fread si fwrite. În acest caz se considera ca înregistrarea este o colectie de date structurate numite articole. La o citire, se transfera într-o zona speciala, numita zona tampon, un numar de articole care se presupune ca au o lungime fixa. În mod analog, la scriere se transfera din zona tampon un numar de articole de lungime fixa. Cele doua functii au prototipurile de mai jos:

unsigned fread (void *ptr, unsigned dim, unsigned nrart, FILE *pf);

unde:

- ptr este pointerul spre zona tampon ce contine articolele citite (înregistrarea citita);

- dim este un întreg ce reprezinta lungimea unui articol;

- nrart este un întreg ce reprezinta numarul articolelor care se transfera;

- pf este un pointer spre tipul FILE care defineste fisierul din care se face citirea.

unsigned fwrite (const void *ptr, unsigned dim, unsigned nrart, FILE *pf);

Parametrii functiei fwrite au aceeasi semnificatie ca si parametrii functiei fread.

Ambele functii returneaza numarul articolelor transferate sau -1 în caz de eroare.

Exemplu:

Programul urmator citeste de la intrarea standard stdin datele ale caror formate sunt definite mai jos si le scrie în fisierul miscari.dat din directorul curent.

tip denumire um cod pret cantitate

TELVIZOR buc 0001 3000000 200

#include <stdio.h>

#define MAX 60

typedef struct ARTICOL;

// 6 articole in zona tampon

union buf;

int cit (ARTICOL *str) // citeste datele de la intrarea standard si le scrie in

// sfarsit while

str -> pret = x;

str -> cant = y;

return (nr);

// sfarsit cit

void main (void) // creaza fisierul miscari.dat cu datele citite de la intrarea standard

for ( ; ; )

// se scrie zona tampon daca nu este vida

if(i !=0 )

if(i!=fwrite(buf.zt, sizeof(ARTICOL), i, pf))

if(n = = EOF) break;

}

fclose(pf);

10.4. sTERGEREA UNUI FIsIER

Un fisier poate fi sters apelând functia unlink. Aceasta are prototipul:

int unlink (const char *cale);

unde:

- cale este un pointer spre un sir de caractere identic cu cel utilizat la crearea fisierului în functia creat sau fopen.

Functia unlink returneaza valoarea zero la o stergere reusita, respectiv -1 în caz de eroare.



Document Info


Accesari: 2586
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )