fisiere in c
DESCRIPTION
prezentare despre fisiere CTRANSCRIPT
-
Fiiere generalitati.
Colecie de date memorate pe un suport extern (floppy,harddisk, etc) identificat printr-un nume.Entiti ale sistemului de operare: numele lor respectconveniile sistemului, fr legtur cu un limbaj de programareNumrul de elemente ale unui fiier este variabil (poate fi nul). Se folosesc pentrudate iniiale sau rezultate mai numeroasepstrarea permanent a unor date de interes pentru anumite aplicaii
-
Operarea cu fisier
se definete o variabil de tip FILE * pentru accesarea fiierului;
2. se deschide fiierul pentru un anumit mod de acces, folosind funcia de biblioteca fopen, care realizeaz i asocierea ntre variabila fiier i numele extern al fiierului
3. se prelucreaz fiierul - citire/scriere cu funciile specifice
4. se nchide fiierul folosind funcia de biblioteca fclose
-
Operaiile specifice prelucrrii fiierelor sunt
crearea unui fiiercitirea de articole din fiier (consultarea fiierului)actualizarea (sau modificarea) fiieruluiadugare de articole la sfritul fiieruluipoziionarea n fiier.tergerea unui fiierschimbarea numelui unui fiier
-
Prelucrarea fiierelor se realizeaz pe dou niveluri:
nivelul inferior (fizic), care apeleaz direct la sistemul de operare.nivelul superior(logic) care utilizeaz structuri speciale FILE Funciile de pe nivelul superior nu asigur o independen total fa de sistemul de operare. Funciile standard de intrare / ieire au prototipurile n fiierul antet .
-
FILE* si nume fisierului fizic
Asocierea dintre numele extern (un ir de caractere) i variabila din program se face la deschiderea unui fiier, printr-o funcie standard.
Fisierul logic este legat de un pointer FILE*. Numele fisierului fizic apare in program o singura data in momentul dechiderii fisierului si serveste pentru comunicare cu cel fizic.
-
Accesul la fisiere.Fiierele standard au pointerii predefinii: stdin,stdout,stderr,stdprn,stdaux.
Declararea unui pointer la fiier are sintaxa :FILE *pf;
Pentru deschiderea unui fiier se folosete funcia FILE * fopen(char *nume_fis, char *mod_acces);
-
int fputs (const char *str, FILE *stream)produce afiarea unui text n fluxul standard de ieire#include < stdio.h > int main (void) { // Linia write test se introduce in fluxul //standard stdout fputs (write test\n,stdout); return 0; }
-
Deschiderea unui fisier.Deschiderea unui fiier stabileste o conexiune logic ntre fiier i variabila pointer i stabilete un mod de acces la fiieraloc o zon de memorie pentru realizarea mai eficient a operaiilor de intrare / ieire
Moduri de acces :r - deschiderea unui fisier existent pentru citire w - pentru scriere sau crearea unui fisier noua - deschiderea unui fisier existent pentru adaugarer+ - deschiderea unui fisier existent pentru citire si scrierew+- crearea unui fisier nou pentru scriere si citirea+ - deschidere pentru adaugare si citire
-
Tipuri de fiiere n CFiiere textconin o succesiune de linii, separate prin NewLinefiecare linie are 0 sau mai multe caractere tipribile i/sau tabFiiere binare conin o succesiune de octei ( In cazul fisierilor binare la litera unui modul de acces se adauga litera b, rb,wb, ect.)
-
Fiiere text i fiiere binare
ntr-un fiier text, toate datele sunt memorate ca iruri de caractere, organizate pe linii, separate ntre ele prin marcajul sfrit de linie \n.
ntr-un fiier binar, datele sunt pstrate n formatul lor intern (2 octei pentru int, 4 octei pentru float, etc).
La fiierele text marcajul de sfrit de fiier (caracterul 0X1A) exist fizic n fiier. La ntlnirea acestui caracter funcia fgetc() ntoarce EOF (-1). Marcajul de sfrit de fiier se genereaz de la tastatur prin Ctrl-Z.
La fiierele binare, marcajul de sfrit de fiier nu exist fizic n fiier, ci este generat de funcia fgetc().
-
Fisiere textCaracter terminator de linie: fiierele Unix/Linux: un singur caracter terminator de linie \nfiierele Windows i MS-DOS: caracterele \r i \n (CR, LF) ca terminator de linie Un fiier text poate fi terminat printr-un caracter terminator de fiier (Ctrl-Z = EOF = -1) Sfritul unui fiier disc poate fi detectat i pe baza lungimii fiierului (numr de octei), memorat pe disc. Se realizeaz conversia automat din/n format extern (ir de caractere) n/din format intern (binar virgul fix sau virgul mobil)
-
Exemple deschidem fis. inp.txt pentru citire FILE *f; // declaram un pointer la fisier f= fopen(inp.txt , r); Pentru excluderea posibilei greseli putem utiliza:
if ( f = fopen(inp.txt , r ) != NULL ) { //prelucrarea fisierului }
-
Exemplu1. Citire si afisare linii din fisiervoid main() { FILE *fp; char s[80]; if ( (fp=fopen("c:\\test.c , "r")) == NULL ) { printf ( "Nu se poate deschide fiierul!\n ); exit (1);} while ( fgets(s, 80, fp) != NULL ) printf ( "%s", s); fclose (fp); }
-
Inchiderea unui fiierint fclose(FILE *pf);ntoarce 0 la nchidere normal i EOF la producerea unui incidentfiierele standard nu se nchid de ctre programatorpentru un fiier de ieire, se scriu datele rmase nescrise din buffer n fiier, aa c operaia de nchidere este obligatorien cazul unui fiier de intrare, datele necitite din bufferul de intrare sunt abandonatese elibereaz bufferele alocatese ntrerupe conexiunea pointer fiier
-
Operatii de intrare / iesire.
TipfisierConversieUnitatetransferataFunctiifolosite
textfaracaracterfgetc()fputc()liniefgets()fputs()culiniifscanf()fprintf()binarfaraarticolfread()fwrite()
-
Operaii de I/ O pentru iruri de caractere
char *fgets( char *s, int n, FILE *pf );citete caractere din fiierul cu pointerul pf, pn la ntlnirea primului caracter \n (cel mult n-1 caractere) n tabloul s; pune la sfrit \n i \0ntoarce s sau NULL la ntlnire sfrit de fiier sau la eroareint fputs( char *s, FILE *pf );copiaz irul n fiierul de ieirenu copiaz terminatorul de ir \0ntoarce un rezultat nenegativ (numrul de caractere scrise n fiier), sau EOF la producerea unei erori
-
Exemplul 2: Copierea unui fisier.
#define MAX 100 void copiere2(FILE *d, FILE *s) { char linie[MAX]; while(fgets(linie, MAX, s)) fputs(linie, d); }
-
Operaii de intrare / ieire cu formatint fprintf(FILE *pf, char *format,lista_expr);transfer n fiierul specificat, valorile expresiilor, convertite, potrivit formatului n caracterentoarce numrul de caractere scrise, sau o valoare negativ, dac s-a produs o eroare.
int fscanf(FILE *pf, char *format, lista_adrese_var);se citesc date din fiierul pf, sub controlul formatului, iniializndu-se variabilele din listfuncia ntoarce numrul de cmpuri citite sau EOF n caz de producere a unui incident la citire sau ntlnire a marcajului de sfrit de fiier.
-
Ex. 3. Se citeste o valoare de tip int din fisierul l1.txt si se scrie in fisierul out_f.txt...void main(){ FILE *f; int dig; if (( f = fopen( "l1.txt , "r )) == NULL) { printf("\n"); exit(0); } fscanf( f, "%d", &dig); fclose(f); f=fopen( "out_f.txt", "w"); fprintf (f," %d",dig); fclose(f); }
- Exemplu 5. Un program pentru scriere unui numar de valori de tip int in fisier binarvoid main(){FILE *f_out; int number; randomize(); f_out = fopen("int.dat","wb" ); if ( ! f_out ) {puts("Is it impossible to create file !"); exit(1); } for(int i=0; i
-
Intrri / ieiri n modul de acces binar sunt operaii de transfer (citiri / scrieri) fr conversiise fac la nivel de articolpoziia n fiier este actualizat dup fiecare citire / scriere
unsigned fread(void *zona, unsigned la, unsigned na, FILE *pf);
citete cel mult na articole, de lungime la fiecare, din fiierul pf n zonantoarce numrul de nregistrri citite sau 0 n caz de eroare sau sfrit de fiier
-
Intrri / ieiri n modul de acces binar
unsigned fwrite(void *zona, unsigned la, unsigned na, FILE *pf);
scrie na articole de lungime la, din zona n fiierul pfntoarce numrul de articole scrise.Pentru a copia un fiier binar (sau text) folosind funciile fread() i fwrite() vom considera lungimea articolului 1 octet.
-
Exemplul 4: Copierea unui fisier in mod binar.
void copiere(FILE * d, FILE * s){ int noc; // numar de octeti cititi char zona[MAX]; while((noc = fread(zona,1,MAX,s))>0) fwrite(zona, 1, noc, d);}
-
Functii pentru acces directint fseek (FILE *fp, long int offset, int poziie)
poziioneaz indicatorul de poziie la valoarea dat de offset fa de poziie:SEEK_SET = 0 - Cutarea se face de la nceputul fis.SEEK_CUR = 1 - Cutare din poziia curentSEEK_END = 2 - Cutare de la sfritul fiierului
Intr-un fiier text poziionarea este posibil numai fat de nceputul fiierului, iar poziia se obine printr-un apel al funciei ftell
-
Poziionarea n fiier long ftell(FILE *pf);ntoarce poziia curent n fiier, exprimat prin numrul de octei fa de nceputul fiierului
void rewind(FILE *pf);realizeaz o poziionare la nceputul fiierului, fiind echivalent cu: fseek(pf, 0L, SEEK_SET);
-
Exemplul 4: Dimensiunea unui fisier.
long FileSize(FILE *pf){ long pozv, noct; pozv = ftell(pf);//salvare poz curenta //pozitionare la sfarsit fseek(pf, 0L, SEEK_END); noct = ftell(pf); // nr de octeti //revenirea la pozitia veche fseek(pf, pozv, SEEK_SET); return noct;}
-
Descriptor al fisierului int fileno (const FILE *stream) ;
"fileno" intoarce numarul- descriptor fisierului. Pentru "stdin", "stdout", and "stderr" fileno intoarce 0, 1, and 2 respectiv. Pentru cele lalte 3-19.In caz de eroare "fileno" returneaza -1
-
Tratarea erorilor
int feof(FILE *pf);ntoarce o valoare diferit de 0, dac s-a detectat marcajul de sfrit de fiier
int ferror(FILE *pf);ntoarce o valoare diferit de 0, dac s-a detectat o eroare n cursul operaiei de intrare / ieire
-
Exemplu.6. Se cauta vaoarea maxima float din fisier si se inlocueste cu valoarea=0void main(){ FILE *f_inp; int n_max; int handle; float val, max, zero=0; f_inp = fopen ( "float.dat ", "rb" ); if ( !f_inp ) { puts(" It is impossible to read file !"); exit(1); } handle = fileno (f_inp); //handle obtine valoarea intoarsa de functia fileno()
-
Exemplu 6. continuare n_max=0; fread(&max, sizeof(float) , 1 , f_inp); for(int i=1; I < filelength (handle); i++) { fread(&val, sizeof(float) , 1 , f_inp); if (val > max) { max=val; n_max=i; } } fseek( f_inp, n_max * sizeof(float), SEEK_SET); fwrite(&zero, sizeof(float), 1, f_inp); fclose(f_inp); }