Scrigroup - Documente si articole

     

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


Fisiere - Deschiderea, Inchiderea, Scrierea unui fisier

c



+ Font mai mare | - Font mai mic



Reprezinta codul ASCII al unui caracter. Se poate reprezenta in unul din modurile:

Fisiere

Caracteristicile generale ale fisierelor

Operatiile care pot fi realizate asupra fisierelor sunt: deschiderea unui fisier, scrierea intr-un fisier, citirea dintr-un fisier, pozitionarea intr-un fisier, inchiderea unui fisier.



Deschiderea unui fisier

Functia fopen

Creaza un flux de date intre fisierul specificat prin numele extern (nume_fisier) si programul C. Parametrul mod specifica sensul fluxului de date si modul de interpretare a acestora. Functia returneaza un pointer spre tipul FILE, iar in caz de eroare - pointerul NULL (prototip in stdio.h).

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

Parametrul mod este o constanta sir de caractere, care poate contine caracterele cu semnificatiile:

r: flux de date de intrare; deschidere pentru citire;

w: flux de date de iesire; deschidere pentru scriere (creaza un fisier nou sau suprascrie continutul anterior al fisierului existent);

a: flux de date de iesire cu scriere la sfarsitul fisierului, adaugare, sau crearea fisierului in cazul in care acesta nu exista;

: extinde un flux de intrare sau iesire la unul de intrare/iesire; operatii de scriere si citire asupra unui fisier deschis in conditiile r, w sau a.

b: date binare;

t: date text (modul implicit).

Exemple:

'r+' - deschidere pentru modificare (citire si scriere);

'w+' - deschidere pentru modificare (citire si scriere);

'rb' - citire binara;

'wb' - scriere binara;

'r+b' - citire/scriere binara.

Functia freopen (stdio.h)

FILE *freopen(const char*nume_fis,const char*mod,FILE *flux_date);

Asociaza un nou fisier unui flux de date deja existent, inchizand legatura cu vechiul fisier si incercand sa deschida una noua, cu fisierul specificat. Functia returneaza pointerul catre fluxul de date specificat, sau NULL in caz de esec (prototip in stdio.h).

Functia open

int open(const char *nume_fisier, int acces [,int mod]);

Deschide fisierul specificat conform cu restrictiile de acces precizate in apel. Returneaza un intreg care este un indicator de fisier sau -1 (in caz de esec) (prototip in io.h).

Restrictiile de acces se precizeaza prin aplicarea operatorului | (disjunctie logica la nivel de bit) intre anumite constante simbolice, definite in fcntl.h, cum sunt :

O_RDONLY    - citire;

O_WRONLY    - scriere

O_RDWR    - citire si scriere

O_CREAT - creare

O_APPEND - adaugare la sfarsitul fisierului

O_TEXT    - interpretare CR-LF

O_BINARY - nici o interpretare.,

Restrictiile de mod de creare se realizeaza cu ajutorul constantelor:

S_IREAD - permisiune de citire din fisier

S_IWRITE - permisiune de scriere din fisier, eventual legate prin operatorul "|".

Functia creat

int creat(const char *nume_fisier, int un_mod);

Creaza un fisier nou sau il suprascrie in cazul in care deja exista. Returneaza indicatorul de fisier sau -1 (in caz de esec). Parametrul un_mod este obtinut in mod analog celui de la functia de deschidere (prototip in io.h).

Functia creatnew

int creatnew(const char *nume_fisier, int mod);

Creaza un fisier nou, conform modului specificat. Returneaza indicatorul fisierului nou creat sau rezultat de eroare (-1), daca fisierul deja exista (prototip in io.h).

Dupa cum se observa, informatia furnizata pentru deschiderea unui fisier este aceeasi in ambele abordari, diferenta constand in tipul de date al entitatii asociate fisierului. Implementarea din io.h ofera un alt tip de control la nivelul comunicarii cu echipamentele periferice (furnizat de functia ioctrl), asupra caruia nu vom insista, deoarece desfasurarea acestui tip de control este mai greoaie, dar mai profunda.

Inchiderea unui fisier

Functia fclose

int fclose(FILE *pf);

Functia inchide un fisier deschis cu fopen si elibereaza memoria alocata (zona tampon si structura FILE). Returneaza valoarea 0 la inchiderea cu succes a fisierului si -1 in caz de eroare (prototip in stdio.h).

Functia fcloseall

int fcloseall(void);

Inchide toate fluxururile de date si returneaza numarul fluxurilor de date inchise (prototip in stdio.h).

Functia close

int close(int indicator);

Inchide un indicator de fisier si returneaza 0 (in caz de succes) sau -1 in caz de eroare (prototip in io.h).

Prelucrarea fisierelor text

Prelucrarea unui fisier la nivel de caracter

Fisierele pot fi scrise si citite caracter cu caracter folosind functiile putc (pentru scriere) si getc (citire).

Functia putc

int putc (int c, FILE *pf);

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.

Functia putc returneaza valoarea lui c (valoarea scrisa in caz de succes), sau -1 (EOF) in caz de eroare sau sfarsit de fisier.

Functia getc

int getc (FILE *pf);

Functia citeste un caracter dintr-un fisier (pointerul spre tipul FILE transmis ca argument) si returneaza caracterul citit sau EOF la sfarsit de fisier sau eroare.

Exemplul 1

Sa se scrie un program care creaza un fisier text in care se vor scrie caracterele introduse de la tastatura (citite din fisierul standard de intrare), pana la intalnirea caracterului ^Z = Ctrl+Z.

#include <stdio.h>

#include <process.h>

void main()

while((c=getchar())!=EOF)    // sau: while ((c=getc(stdin)) != EOF)

putc(c,pfcar); // scrierea caracterului in fisier

fclose(pfcar); // inchiderea fisierului

Exemplul 2

Sa se scrie un program care citeste un fisier text, caracter cu caracter, si afiseaza continutul acestuia.

#include <stdio.h>

#include <process.h>

void main()

while((c=getc(pfcar))!=EOF) //citire din fisier, la nivel de caracter

putc(c,stdout);

//scrierea caracterului citit in fisierul standard de iesire (afisare pe monitor)

fclose(pfcar);

Prelucrarea unui fisier la nivel de cuvant

Functiile putw si getw (putword si getword) sunt echivalente cu functiile putc si getc, cu diferenta ca unitatea transferata nu este un singur octet (caracter), ci un cuvant (un int).

int getw(FILE *pf);

int putw (int w, FILE *pf);

Se recomanda utilizarea functiei feof pentru a testa intalnirea sfarsitului de fisier.

Exemplul 1

int tab[100];

FILE *pf;   

deschidere fisier

while (!feof(pf))

printf('Sfarsit de fisiern');

Exemplu:l 2

#include <stdio.h>

#include <process.h>

void main()

while((c=getchar())!=EOF)    // sau: while ((c=getc(stdin)) != EOF)

putc(c,pfcar); // scrierea caracterului Śn fisier

fclose(pfcar);    // Śnchiderea fisierului

Prelucrarea unui fisier la nivel de sir de caractere

Intr-un fisier text, liniile sunt considerate ca linii de text separate de sfarsitul de linie ('n'), iar in memorie, ele devin siruri de caractere terminate de caracterul nul ('0'). Citirea unei linii de text dintr-un fisier se realizeaza cu ajutorul functiei fgets, iar scrierea intr-un fisier - cu ajutorul functiei fputs.

Functia fgets este indentica cu functia gets, cu deosebirea ca functia gets citeste din fisierul standard de intrare (stdin). Functia fputs este indentica cu functia puts, cu deosebirea functia puts scrie in fisierul standard de iesire (stdout).

Functia fputs

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

Functia scrie un sir de caractere intr-un fisier si primeste ca argumente pointerul spre zona de memorie (buffer-ul) care contine sirul de caractere (s) si pointerul spre structura FILE. Functia returneaza ultimul caracter scris, in caz de succes, sau -1 in caz de eroare.

Functia fgets

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

Functia citeste maximum dim-1 octeti (caractere) din fisier, sau pana la intalnirea sfarsitului de linie. Pointerul spre zona in care se face citirea caracterelor este s. Terminatorul null ('0') este plasat automat la sfarsitul sirului (buffer-lui de memorie). Functia returneaza un pointer catre buffer-ul in care este memorat sirul de caractere, in caz de succes, sau pointerul NULL in cazul esecului.

Exemplul 1

Sa se scrie un program care creaza un fisier text in care se vor scrie sirurile de caractere introduse de la tastatura.

#include <stdio.h>

void main()

fclose(pfsir);

Exemplul 2

Sa se scrie un program care citeste un fisier text, linie cu linie, si afiseaza continutul acestuia

#include <stdio.h>

void main()

fclose(pfsir);}

Exemplul 3

Sa se scrie un program care creeaza un fisier text "tabel":

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <string.h>

#define PI 3.1415926

void main()

fclose(pfsir);

Exemplul 4

Scrieti un program care sa faca o copie (caracter cu caracter) a unui fisier text dat.

//Patrut 5/113

#include <stdio.h>

void main(void)

if ((out = fopen(dest, 'wt')) == NULL)

// se copiaza caracterele din 'in' in 'out'

while (!feof(in))

fputc(fgetc(in),out);

fclose(in); fclose(out);

Fisiere - continuare

Intrari/iesiri binare

Exemplul 1

Sa se scrie un program care creaza un fisier binar in care se vor introduce numere reale, nenule.

#include <iostream.h>

#include <stdio.h>

int main()

cout<<'nIntroduceti numere(diferite de 0) terminate cu un 0:'<<'n';

cin>>nr;

while(nr!=0)

fclose(f);

return 0;

Exemplul 2

Sa se scrie un program ce citeste dintr-un fisier binar numere reale, nenule.

#include <iostream.h>

#include <stdio.h>

int main()

cout<<'nNumerele nenule citite din fisier sunt:'<<'n';

while((fread(&buf, sizeof(buf), 1, f))==1)

// functia sizeof(buf) care returneaza numarul de octeti necesari variabilei buf.

cout<<buf<<' ';

fclose(f);

cout<<'n';

return 0;

Pozitionarea intr-un fisier

Pe langa mecanismul de pozitionare implicit (asigurat prin operatiile de citire si scriere) se pot folosi si operatiile de pozitionare explicita.

Functia fseek

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

Functia deplaseaza capul de citire/scriere al discului, in vederea prelucrarii inregistrarilor fisierului intr-o ordine oarecare. Functia seteaza pozitia curenta in fluxul de date la n octeti fata de referinta):

deplasament - defineste numarul de octeti peste care se va deplasa capul discului;

referinta - poate avea una din valorile:

0 - inceputul fisierului (SEEK_SET);

1 - pozitia curenta a capului (SEEK_CUR);

2 - sfarsitul fisierului (SEEK_END).

Functia returneaza valoarea zero la pozitionarea corecta si o valoare diferita de zero in caz de eroare (prototip in stdio.h).

Functia lseek

int lseek(int indicator, long n, int referinta);

Seteaza pozitia curenta de citire/scriere in fisier la n octeti fata de referinta. Returneaza valoarea 0 in caz de succes si diferita de zero in caz de eroare (prototip in io.h).

Functia fgetpos

int fgetpos(FILE *flux_date, fpos_t *pozitie);

Determina pozitia curenta (pointer catre o structura, fpos_t, care descrie aceasta pozitie in fluxul de date). Inscrie valoarea indicatorului in variabila indicata de pozitie. Returneaza 0 la determinarea cu succes a acestei pozitii sau valoare diferita de zero in caz de esec. Structura care descrie pozitia poate fi transmisa ca argument functiei fsetpos (prototip in stdio.h).

Functia fsetpos

int fsetpos(FILE *flux_date, const fpos_t *pozitie);

Seteaza pozitia curenta in fluxul de date (atribuie indicatorului valoarea variabilei indicate pozitie), la o valoare obtinuta printr apelul functiei fgetpos. Returneaza valoarea 0 in caz de succes, sau diferita de 0 in caz de esec (prototip in stdio.h).

Exista functii pentru modificarea valorii indicatorului de pozitie si de determinare a pozitiei curente a acestuia.

Functia ftell

long ftell(FILE *pf);

Indica pozitia curenta a capului de citire in fisier. Functia returneaza o valoare de tip long int care reprezinta pozitia curenta in fluxul de date (deplasamentul in octeti a pozitiei capului fata de inceputul fisierului) sau -1L in caz de eroare (prototip in stdio.h).

Functia tell

long tell(int indicator);

Returneaza pozitia curenta a capului de citire/scriere in fisier (exprimata in numar de octeti fata de inceputul fisierului), sau -1L in caz de eroare (prototip in io.h).

Functia rewind

void rewind(FILE *flux_date);

Pozitioneaza indicatorul la inceputul fluxului de date specificat ca argument (prototip in stdio.h).

Functii utilitare pentru lucrul cu fisiere

Functii de testare a sfarsitului de fisier

Functia feof

int feof(FILE *flux_date);

Returneaza o valoare diferita de zero in cazul intalnirii sfarsitului de fisier sau 0 in celelalte cazuri (prototip in stdio.h).

Functia eof

int eof(int indicator);

Returneaza valoarea 1 daca pozitia curenta este sfarsitul de fisier, 0 daca indicatorul este pozitionat in alta parte, sau -1 in caz de eroare (prototip in io.h).

Functii de golire a fluxurilor de date

Functia fflush

int fflush(FILE *flux_date);

Goleste un fluxul de date specificat ca argument. Returneaza 0 in caz de succes si -1 (EOF) in caz de eroare (prototip in stdio.h).

Functia flushall

int flushall(void);

Goleste toate fluxurile de date existente, pentru cele de scriere efectuand si scrierea in fisiere. Returneaza numarul de fluxuri asupra carora s-a efectuat operatia (prototip in stdio.h).

Alte operatii cu fisiere

Functii care permit operatii ale sistemului de operare asupra fisierelor

Functia remove

int remove(const char *nume_fisier);

Sterge un fisier. Returneaza valoarea 0 pentru operatie reusita si -1 pentru operatie esuata (prototip in stdio.h).

Functia rename

int rename(const char *nume_vechi, const char *nume_nou);

Redenumeste un fisier. Returneaza 0 pentru operatie reusita si -1 in cazul esecului (prototip in stdio.h).

Functia unlink

int unlink(const char *nume_fisier);

Sterge un fisier. Returneaza 0 la operatie reusita si -1 la esec; daca fisierul are permisiune read-only, functia nu va reusi operatia (prototip in io.h, stdio.h).

Functii care permit manipularea aceluiasi fisier prin doua indicatoare de fisier independente

Functia dup

int dup(int indicator);

Duplica un indicator de fisier. Returneaza noul indicator de fisier pentru operatie reusita sau -1 in cazul esecului (prototip in io.h).

Functia dup2

int dup2(int indicator_vechi, int indicator_nou);

Duplica un indicator de fisier la valoarea unui indicator de fisier deja existent. Returneaza 0 in caz de succes si -1 in caz de esec (prototip in io.h).

Functii pentru aflarea sau modificarea dimensiunii in octeti a fisierelor

Functia chsize

int chsize(int indicator, long lungime);

Modifica dimensiunea unui fisier, conform argumentului lungime. Returneaza 0 pentru operatie reusita sau -1 in caz de esec (prototip in stdio.h).

Functia filelength

long filelength(int indicator);

Returneaza lungimea unui fisier (in octeti) sau -1 in caz de eroare (prototip in io.h).

Functii de lucru cu fisiere temporare care ofera facilitati de lucru cu fisiere temporare prin generarea de nume unice de fisier in zona de lucru.

Functia tmpfile

FILE *tmpfile(void);

Deschide un fisier temporar, ca flux de date, in mod binar (w+b). Returneaza pointerul catre fisierul deschis in cazul operatiei reusite, sau NULL in caz de esec (prototip in stdio.h).

Functia tmpnam

char *tmpnam(char *sptr);

Creaza un nume unic pentru fisierul temporar (prototip in stdio.h).

Functia creattemp

int creattemp(char *cale, int attrib);

Creeaza un fisier unic ca nume, cu atributele specificate in argumentul attrib (prin _fmode,O_TEXT sau O_BINARY), in directorul dat in argumentul cale. Returneaza indicatorul (handler-ul) catre fisierul creat sau -1 (si setarea errno) in cazul esecului (prototip in io.h).

Exemplu: - Fisier despre angajatii unei intreprinderi

Sa se creeze un fisier binar, care va contine informatiile despre angajatii unei intreprinderi: nume, marca, salariu. Sa se afiseze apoi continutul fisierului.

#include<iostream.h>

#include <stdio.h>

#include <ctype.h>

typedef struct

angajat;

union

buffer;

int main()

do

while(toupper(cont)!='N');

fclose(pf);

//citirea informatiilor

if ((pf= fopen(nume_fis, 'rb')) == NULL)

for(;;)

fclose(pf);

Aplicatie pentru gestiunea materialelor dintr-un depozit.

Aplicatia va avea un meniu principal si va permite gestiunea urmatoarelor informatii: codul materialului (va fi chiar 'numarul de ordine'), denumirea acestuia, unitatea de masura, pretul unitar, cantitatea contractata si cea receptionata (vectori cu 4 elemente). Memorarea datelor se va face intr-un fisier de date (un fisier binar cu structuri), numit 'material.dat'. Aplicatia contine urmatoarele functii:

help() - informare privind optiunile programului

Functii pentru fisierele binare, care sa suplineasca lipsa functiilor standard pentru organizarea directa a fisierelor binare:

citireb()    - citire in acces direct din fisier;

scrieb()    - scriere in acces direct in fisier;

citmat()    - citirea de la terminal a informatiilor despre un material;

afismat()    - afisarea informatiilor despre un material (apelata de list);

lungfisis() - determinarea lungimii fisierului existent;

crefis()    - creare fisier.

Functii pentru adaugarea, modificarea, stergerea si listarea de materiale.

#include <process.h>

#include <iostream.h>

#include <stdio.h>

#include <ctype.h>

typedef struct material

;

material mat;

FILE *pf;

void crefis(),adaug(),modif(),sterg(),list(),help();

void main()

}while(toupper(optiune)!='E');

}

void help()    // afisare informatii despre utilizarea meniului si optiunile acestuia

long int lungfis(FILE *f) // returneaza lungimea fisierului

void scrieb(int nr,void *a,FILE *f) //scriere in fisierul binar

}

void citireb(int nr,void *a,FILE *f) //citire din fisierul binar

}

void afismat(material *a) //afisarea informatiilor despre un anumit material

else cout<<'Acest articol a fost sters !'<<'n';

}

void citmat(material *a) //citirea informatiilor despre un anumit material

cout<<'Introduceti cantitatile receptionate : '<<'n';

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

}

void crefis() //deschidere fisier

void adaug() //adaugare de noi materiale

while(mat.codm);

fclose(pf);

}

void modif() //modificarea informatiilor despre un material existent

while(ch!='D' && ch!='N');

if(ch=='D')

}

}while(na);

fclose(pf);

}

void sterg() //stergerea din fisier a unui material

while(!(n>=0 && n<=na));

if(n) scrieb(n,&mat,pf);

}while(n);

fclose(pf);

}

void list() //afisare informatii despre un anumit material

}while(na);

fclose(pf);

}

Probleme practice

Scrieti un program de tiparire a continuturilor mai multor fisiere, ale caror nume se transmit ca parametri catre functia main. Tiparirea se face pe ecran (lungimea paginii = 22) sau la imprimanta (lungimea paginii = 61). Continutul fiecarui fisier va incepe pe o pagina noua, cu un titlu care indica numele fisierului. Pentru fiecare fisier, paginile vor fi numerotate (cu ajutorul unui contor de pagini).

Scrieti un program care citeste un fisier text. Pornind de la continutul acestuia, se va crea un alt fisier, prin inlocuirea spatiilor consecutive cu unul singur. Se vor afisa pe ecran continutul fisierului de la care s-a pornit si continutul fisierului obtinut.

Sa se consulte continutul unui fisier si sa se afiseze urmatoarele informatii statistice: numarul de cuvinte din fisier, numarul de caractere, numarul de linii, numarul de date numerice (nu cifre, numere!).

Scrieti un program care sa compare continutul a doua fisiere, si afisati primele linii care difera si pozitia caracterelor diferite in aceste linii.

Scrieti un program care citeste continutul unui fisier sursa scris in limbajul C si afiseaza in ordine alfabetica fiecare grup al numelor de variabile care au primele n caractere identice (n este citit de la tastatura).

Scrieti un program care consulta un fisier text si afiseaza o lista a tuturor cuvintelor din fisier. Pentru fiecare cuvant se vor afisa si numerele liniilor in care apare cuvantul.

Scrieti un program care citeste un text introdus de la tastatura si afiseaza cuvintele distincte, in ordinea crescatoare a frecventei lor de aparitie. La afisare, fiecare cuvant va fi precedat de numarul de aparitii.

Scrieti un program care citeste un text introdus de la tastatura, ordoneaza alfabetic liniile acestuia si le afiseaza.

Scrieti o aplicatie pentru gestiunea informatiilor despre cartile existente intr-o biblioteca. Aplicatia va avea un meniu principal care va permite:

Memorarea datelor intr-un fisier (un fisier binar cu structuri), al carui nume se introduce de la tastatura. Fisierul va contine informatiile: nume carte, autor, editura, anul aparitiei, pret. Pentru fiecare carte, se va genera o cota (un numar unic care sa constituie cheia de cautare).

Adaugarea de noi carti;

Afisarea informatiilor despre o anumita carte;

Cautarea titlurilor dupa un anumit autor;

Modificarea informatiilor existente;

Lista alfabetica a tuturor autorilor;

Stergerea unei carti din biblioteca;

Ordonarea descrescatoare dupa anul aparitiei;

Numele celei mai vechi carti din biblioteca;

Numele celei mai scumpe carti din biblioteca;

Numele autorului cu cele mai multe carti;

Valoarea totala a cartilor din biblioteca.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 2019
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