Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Nivelul superior de prelucrare a fisierelor

c



+ Font mai mare | - Font mai mic



Nivelul superior de prelucrare a fisierelor

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



1. Deschiderea unui fisier

Functia fopen se utilizeaza pentru deschiderea unui fisier. Ea returneaza un pointer spre tipul FILE (tipul fisier), tip definit in fisierul stdio h. Tipul FILE este un tip structurat si el depinde de sistemul de operare. In 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 in 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 in felul urmator:

- "r" - deschidere in citire (read);

- "w" - deschidere in 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 in 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 in aceea ca aceste fisiere nu se deschid si nici nu se inchid de catre programator. Ele sunt deschise automat la lansarea in executie a programului si se inchid la apelul functiei exit

4o. Apelul functiei se realizeaza prin constructia:

FILE *pf;

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

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 in fisier;

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

Functia putc returneaza valoarea lui c respectiv -1 in 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; in particular pf poate fi stdin.

Functia getc returneaza codul ASCII al caracterului citit sau EOF la sfarsit de fisier sau eroare.

3. Inchiderea unui fisier

Inchiderea 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 inchiderea normala a fisierului;

1 in 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 in 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);

}

4. 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 intr-un fisier.

Functia fscanf este asemanatoare cu functia scanf. Ea are un parametru in 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 campurilor citite din fisier. La intalnirea sfarsitului de fisier se returneaza valoarea EOF definita in fisierul stdio h. Pentru pf = stdin, functia fscanf este identica cu scanf.

Functia fprintf , ca si functia printf, returneaza numarul caracterelor scrise in fisier sau -1 in 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 inregistrari cu numele, prenumele si adresa unor persoane.

#include <stdio.h>

void main(void)

do

while (i<=n);

fclose(pf);

5. Intrari-iesiri de siruri de caractere

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

Functia fgets are prototipul:

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

unde:

s este pointerul spre zona in 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 intalnirea caracterului 'n', citirea se opreste. In acest caz, in zona receptoare se transfera caracterul 'n' si apoi caracterul NUL ('0').

In mod normal, functia returneaza valoarea pointerului s. La intalnirea sfarsitului de fisier se returneaza valoarea NULL.

Functia fputs scrie intr-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 in 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 pana la intalnirea caracterului 'n' care nu mai este pastrat in zona spre care pointeaza s. Sirul de caractere citit se termina si in acest caz prin '0'.

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

6. Pozitionarea intr-un fisier

Cu ajutorul functiei fseek se poate deplasa capul de citire/scriere al discului in vederea prelucrarii inregistrarilor fisierului intr-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 in care se face pozitionarea capului de citire/scriere;

deplasament si origine au aceeasi semnificatie ca si in cazul functiei lseek.

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

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

long ftell (FILE *pf);

unde:

pf este pointerul spre tipul FILE care defineste fisierul in cauza.

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

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. In acest caz se considera ca inregistrarea este o colectie de date structurate numite articole. La o citire, se transfera intr-o zona speciala, numita zona tampon, un numar de articole care se presupune ca au o lungime fixa. In 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 (inregistrarea citita);

- dim este un intreg ce reprezinta lungimea unui articol;

- nrart este un intreg 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 in caz de eroare.

Exemplu:

Programul urmator citeste de la intrarea standard stdin datele ale caror formate sunt definite mai jos si le scrie in 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;

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);



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 811
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved