Diferență între revizuiri ale paginii „PC Laborator 13”
m (→Obiective) |
m (→Exerciții) |
||
(Nu s-au afișat 4 versiuni intermediare efectuate de același utilizator) | |||
Linia 6: | Linia 6: | ||
== Informații generale == | == Informații generale == | ||
− | Datele pot fi stocate temporar în memoria internă,dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate | + | Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă. |
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau '''stream''').(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]). | Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau '''stream''').(vezi [[PC Laborator 3#Stream-urile standard ale unui proces|PC Laborator 3]]). | ||
Linia 52: | Linia 52: | ||
* "r" - (read only), permite deschiderea doar pentru citirea conținutului | * "r" - (read only), permite deschiderea doar pentru citirea conținutului | ||
− | * "w" - (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume,conținutul va fi sters | + | * "w" - (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters |
− | * "a" - (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare)-adăugare- | + | * "a" - (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare- |
− | * "r+" - deschide un fişier pentru actualizarea datelor,permite atât scriere cât şi citire | + | * "r+" - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire |
* "w+" - crează un fişier nou în care se vor putea scrie cât şi citi date. | * "w+" - crează un fişier nou în care se vor putea scrie cât şi citi date. | ||
* "a+" - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente | * "a+" - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente | ||
Linia 65: | Linia 65: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
FILE *fisier; | FILE *fisier; | ||
− | fisier = fopen ("exemplu.txt", "w"); | + | fisier = fopen("exemplu.txt", "w"); |
− | if (fisier == NULL){ | + | if (fisier == NULL) { |
− | printf ("Fisierul nu poate fi creat."); | + | printf("Fisierul nu poate fi creat."); |
− | }else{ | + | } else { |
− | printf ("Fisierul a fost creat"); | + | printf("Fisierul a fost creat"); |
} | } | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | <div class="regula">'''<font color="red"> Observatie:</font> '''În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată'''</div> | + | <div class="regula">'''<font color="red"> Observatie:</font> '''În acest mod se confirmă și crearea corectă a fișierului, fiind o practică recomandată.'''</div> |
=== Închiderea fișierelor === | === Închiderea fișierelor === | ||
Linia 83: | Linia 83: | ||
Închiderea unui fişier se face cu funcţia fclose (). | Închiderea unui fişier se face cu funcţia fclose (). | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | int fclose (FILE *fisier) | + | int fclose(FILE *fisier) |
</syntaxhighlight> | </syntaxhighlight> | ||
− | <div class="regula">'''<font color="red"> Observatie:</font> '''Funcţia fclose () returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.'''</div> | + | <div class="regula">'''<font color="red"> Observatie:</font> '''Funcţia fclose() returnează 0 dacă operaţia de închidere a fişierului s-a realizat cu succes şi EOF dacă a intervenit o eroare.'''</div> |
==== Exemplu ==== | ==== Exemplu ==== | ||
Linia 92: | Linia 92: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
FILE *fisier; | FILE *fisier; | ||
− | fisier=fopen("/work/pc/F/group1/ion/lab13/test.txt", "w"); | + | fisier = fopen("/work/pc/F/group1/ion/lab13/test.txt", "w"); |
− | if (fisier==NULL){ | + | if (fisier == NULL) { |
printf("Fisierul nu a putut fi creat"); | printf("Fisierul nu a putut fi creat"); | ||
− | }else{ | + | } else { |
//... | //... | ||
fclose(fisier); | fclose(fisier); | ||
Linia 109: | Linia 109: | ||
Poziția curent este dată de funcția ftell(): | Poziția curent este dată de funcția ftell(): | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | int ftell (FILE *fisier) | + | int ftell(FILE *fisier) |
</syntaxhighlight> | </syntaxhighlight> | ||
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek(): | Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek(): | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | int fseek (FILE *fisier, long pozitie, int referinta) | + | int fseek(FILE *fisier, long pozitie, int referinta) |
</syntaxhighlight> | </syntaxhighlight> | ||
− | <div class="regula">'''<font color="red"> Observatie:</font> '''În termeni uzuali se folosește long offset, int whence.Offset fiind numărul de octeți peste care se deplasează,iar whence poziția cursorului'''</div> | + | <div class="regula">'''<font color="red"> Observatie:</font> '''În termeni uzuali se folosește long offset, int whence. Offset fiind numărul de octeți peste care se deplasează, iar whence poziția cursorului'''</div> |
Whence poate avea una din cele trei valori posibile: | Whence poate avea una din cele trei valori posibile: | ||
Linia 127: | Linia 127: | ||
<div class="sfat">''' | <div class="sfat">''' | ||
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii: | În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii: | ||
− | *scriere: <code style="color: green">fputs()</code> | + | *scriere: <code style="color: green">fputs()</code> şi <code style="color: green">fprintf()</code> |
*citire: <code style="color: green">fgets()</code> şi <code style="color: green">fscanf()</code> | *citire: <code style="color: green">fgets()</code> şi <code style="color: green">fscanf()</code> | ||
− | ''' Funcţiile <code style="color: green">fscanf()</code> şi <code style="color: green">fprintf()</code> funcţionează identic cu funcţiile <code style="color: green">scanf()</code> şi <code style="color: green">printf()</code>, cu deosebirea că citirea respectiv scrierea | + | ''' Funcţiile <code style="color: green">fscanf()</code> şi <code style="color: green">fprintf()</code> funcţionează identic cu funcţiile <code style="color: green">scanf()</code> şi <code style="color: green">printf()</code>, cu deosebirea că citirea respectiv scrierea operează asupra unui fişier specificat ca prim parametru: |
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
Linia 142: | Linia 142: | ||
<syntaxhighlight lang="C"> | <syntaxhighlight lang="C"> | ||
− | size_t fread (void *ptr,size_t noct,size_t nr,FILE *f); | + | size_t fread(void *ptr, size_t noct, size_t nr, FILE *f); |
− | size_t fwrite (void *ptr,size_t noct,size_t nr,FILE *f); | + | size_t fwrite(void *ptr, size_t noct, size_t nr, FILE *f); |
</syntaxhighlight> | </syntaxhighlight> | ||
</div> | </div> | ||
− | |||
=== Exerciții === | === Exerciții === | ||
− | #Să se scrie | + | #Să se scrie un program care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text. |
− | #Să se scrie | + | #Să se scrie un program care citește un fișier text și îl afișeză linie cu linie. |
Versiunea curentă din 11 ianuarie 2017 20:44
Obiective
La încheierea acestui laborator studentul va fi capabil să:
- să lucreze cu fișiere text: deschidere, citire, scriere, închidere
- să înțeleagă modul de funcționare al fișierelor binare
Informații generale
Datele pot fi stocate temporar în memoria internă, dar la închiderea programului acestea se vor pierde. Pentru suportul acestui dezavantaj se poate folosi noțiunea de fișier, desigur stocat in memoria externă. Memoria externă furnizează o capacitate de stocare mult mai mare decât memoria internă, nu este volatilă, deci nu-şi pierde conţinutul la o eventuală întrerupere, dar are ca principal dezavantaj viteza de transfer a datelor redusă.
Prelucrarea unui fişier presupune asocierea acestuia cu un canal de I/E (numit flux sau stream).(vezi PC Laborator 3).
Limbajul C permite operarea cu fişiere:
- text - fişier ce conţine o succesiune de linii
- binare - fişier conţine o succesiune de octeti, fără o structură.
- "b" - specifică fişier de tip binar
- "t" - specifică fişier de tip text (implicit)
Operații cu fișiere
Pentru a avea acces la informaţiile dintr-un fişier, se realizează următoarele operaţii:
- deschiderea fişierului
- citirea/scrierea conţinutului fişierului
- închiderea fisierului
Atunci când intenționăm să lucrăm cu fişiere este necesar să ne definim un pointer către o structură de tipul FILE. O structură de tipul FILE este o structură de control a streamurilor. Această structură păstrează informaţii cum ar fi adresa de început, poziţia indicatorului de fişier, poziţia indicatorului de sfârşit a fişierului și altele. Pentru a se putea utiliza un fişier, este necesară folosirea unui pointer. Acesta este un pointer către anumite informaţii despre fişierul respectiv – nume, starea şi poziţia în care se află poinetrul de fişier.
FILE * fisier;
Deschiderea fișierelor
Fişierele necesită a fi inițializate, le trebuie asociat un fişier fizic de pe dispozitivul de stocare.
FILE *fopen(const char *nume_fișier, const char *mod);
- FILE -returnează un pointer la fișier
- nume_fișiere -se specifică numele sau calea acestuia
- mod -se specifică modul de deschidere al fișierului
Moduri de deschidere al fișierelor:
- "r" - (read only), permite deschiderea doar pentru citirea conținutului
- "w" - (write), crează un nou fişier în care se pot scrie date. Dacă exista deja un fișier cu acest nume, conținutul va fi sters
- "a" - (append), deschide pentru scriere într-un fişier existent (scrierea se va face în continuare) -adăugare-
- "r+" - deschide un fişier pentru actualizarea datelor, permite atât scriere cât şi citire
- "w+" - crează un fişier nou în care se vor putea scrie cât şi citi date.
- "a+" - deschide un fişier pentru adăugare de date cât şipentru citire. Operațiile de scriere vor fi efectuate în continuarea datelor existente
Exemplu
FILE *fisier;
fisier = fopen("exemplu.txt", "w");
if (fisier == NULL) {
printf("Fisierul nu poate fi creat.");
} else {
printf("Fisierul a fost creat");
}
Închiderea fișierelor
După ce sunt folosite, fişierele trebuie închise. Atunci când execuţia programului se încheie cu succes (fie prin încheierea execuţiei funcţiei main (), fie prin apelarea funcţiei exit() ), toate fişierele deschise în momenul respectiv sunt automat închise. Închiderea unui fişier se face cu funcţia fclose ().
int fclose(FILE *fisier)
Exemplu
FILE *fisier;
fisier = fopen("/work/pc/F/group1/ion/lab13/test.txt", "w");
if (fisier == NULL) {
printf("Fisierul nu a putut fi creat");
} else {
//...
fclose(fisier);
}
Parcurgerea fișierelor
Orice fişier, odată deschis, are asociat un cursor care indică poziţia curentă în fişierul respectiv (inițial această poziție este la începutul fişierului). Funcţiile de scriere şi citire din fişiere operează începand de la poziţia curentă a cursorului. Totodată, orice operaţie de scriere sau citire avansează automat acest cursor cu numărul de octeţi citiţi/scrişi.
Poziția curent este dată de funcția ftell():
int ftell(FILE *fisier)
Poziţionarea cursorului pe o anumita poziţie se poate face folosind funcţia fseek():
int fseek(FILE *fisier, long pozitie, int referinta)
Whence poate avea una din cele trei valori posibile:
- SEEK_SET = 0 - Căutarea se face de la începutul fişierului
- SEEK_CUR = 1 - Căutare din poziţia curentă
- SEEK_END = 2 - Căutare de la sfârşitul fişierului
Citirea şi scrierea în/din fişiere
În cazul în care se lucrează cu fişiere text se folosesc în mod uzual următoarele funcţii:
- scriere:
fputs()
şifprintf()
- citire:
fgets()
şifscanf()
Funcţiile fscanf()
şi fprintf()
funcţionează identic cu funcţiile scanf()
şi printf()
, cu deosebirea că citirea respectiv scrierea operează asupra unui fişier specificat ca prim parametru:
int fprintf(FILE *f, const char *format, ...);
int fscanf(FILE *f, const char *format, ...);
Funcţiile recomandate pentru lucrul cu fişiere binare sunt urmatoarele:
- scriere:
fwrite()
- citire:
fread()
size_t fread(void *ptr, size_t noct, size_t nr, FILE *f);
size_t fwrite(void *ptr, size_t noct, size_t nr, FILE *f);
Exerciții
- Să se scrie un program care citește de la tastatură un text de mai multe linii și îl scrie într-un fișier text.
- Să se scrie un program care citește un fișier text și îl afișeză linie cu linie.