6Prelucrarea fişierelor în limbajul C
Prelucrarea fişierelor în limbajul C se face asociind fiecărui fişier un stream. Pentru aceasta se defineşte un pointer la o variabilă tip FILE cu instrucţiunea:
FILE* ptrfile;
Un fişier trebuie deschis înainte de prelucrare şi trebuie închis după prelucrare. Asocierea unui fişier cu un stream se face la deschiderea fişierului cu instrucţiunea:
ptrfile = fopen(nume_fişier, mod);
unde ptrfile este o variabilă de tipul FILE* iar nume_fişier este un şir de caractere cu numele fişierului. Parametrul mod este un şir de caractere ce conţine modul de descriere al fişierului, în citire sau în creare. Functia fopen() returnează un pointer ce nu trebuie modificat. Funcţia fopen() returneaza un pointer NULL când operaţia de deschidere a fişierului a eşuat.
Închiderea fişierului se face cu instrucţiunea:
fclose(ptrfile);
Prototipurile tuturor funcţiilor pentru operaţii cu fişiere în limbajul C sunt definite în biblioteca (sau pentru limbajul C++).
In această lucrare vom scrie programe C pentru prelucrarea fişierelor, deci vom utiliza stilul C pentru directiva include.
Menţionăm că, totdeauna sunt predefinite streamurile stdin, asociat fişierului standard de intrare şi stdout asociat fişierului standard de ieşire.
Fişierele au un indicator de poziţie ce dă adresa următorului octet de citit sau scris. Acest indicator este iniţial pus la zero şi este actualizat de operaţiile de citire sau scriere.
6.1Fişiere text
În cazul fişierelor text, parametrul mod al funcţiei fopen() este “r” pentru citire şi “w” pentru creare. Instrucţiunile de scriere şi citire cu format sunt :
fprintf(ptrfile, format, listă de variabile);
fscanf(ptrfile, format, listă de variabile);
în care ptrfile este variabila tip FILE* asociată fişierului.
Instrucţiunile de scriere şi citire cu format asociate fişierelor standard sunt:
printf(format, listă de variabile);
scanf(format, listă de variabile);
Parametrul format este un şir de caractere compus din specificatori de conversie definiţi de % şi alte caractere. Specificatorii de conversie sunt :
%d – întreg cu semn în baza 10
%x - întreg cu semn în baza 16
%c – caracter
%s – şir de caractere
%p - pointer
%f – număr real tip float
%lf – număr real tip double
Menţionăm că, în cazul instrucţiunilor scanf, fscanf, argumentele sunt parametri de ieşire, deci de tip pointer.
Fişierele text sunt formate din linii ce conţin zero sau mai multe caractere, urmate de caracterul ‘\n’. Pentru prelucrarea acestor fişiere este util să putem citi sau scrie caractere şi linii, adică şiruri de caractere terminate cu caracterul ‘\n’.
Fişierele text au indicator de poziţie ce conţine numărul următorului caracter de scris sau de citit. Acest indicator are valoarea zero la deschiderea fişierului şi apoi este modificat de instrucţiunile de citire sau scriere a fişierului.
Funcţiile intrare / ieşire tip caracter sunt următoarele:
int fgetc(FILE * stream);
int getchar();
int fputc(int c, FILE * stream);
int putchar(int c);
char * fgets(char * s, int n, FILE * stream);
int fputs(const char * s, FILE * stream);
In aceste instrucţiuni stream este variabila asociată fişierului. Funcţia fgetc()nciteşte un caracter din stream, funcţia getchar citeşte un caracter din streamul stdin. Funcţia fputc() scrie un caracter în stream, funcţia putchar scrie un caracter în streamul stdout. Funcţia fgets() citeşte cel mult n – 1 caractere din stream în şirul s. Funcţia fputs scrie şirul s în stream. La întâlnirea sfârşitului de fişier, funcţiile fgetc() şi getchar() returnează constanta EOF.
Probleme rezolvate
Problema 1 Să se creeze un fişier text cu 26 de linii de câte 10 caractere fiecare. Liniile vor conţine caracterele ‘A’, ‘B’, … , ‘Z’. Să se citească fişierul creat la punctul anterior şi să se listeze pe ecran. Se va examina fişierul creat cu un editor. Programul ce rezolvă problema este următorul.
#include
int main()
{
FILE* file;
int i, j;
char x[10];
// deschide fisierul in scriere
file = fopen("rez.txt", "w");
for(i = 0; i < 26; i++)
{
for(j = 0; j < 9; j++)
x[j] = 'A' + i;
x[9] = 0;
fprintf(file, "%s\n", x);
}
fclose(file);
// deschide fisierul in citire
file = fopen("rez.txt", "r");
for(i = 0; i < 26; i++)
{
fscanf(file, "%s", x);
printf("%s\n", x);
}
fclose(file);
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
Problema 2. Fie expresia . Să se calculeze valorile expresiei pentru a=1.25 şi x luând valori de la 1 la 2 cu pasul 0.2. Valorile expresiei se vor scrie intr-un fişier sub forma
x e(x)
1.0 ……
1.2 ……
………………………
2.0 ……
Se va citi apoi fişierul creat şi se va afişa pe ecran. Se va examina fişierul creat cu un editor. Programul ce rezolvă problema este următorul.
#include
int main()
{
FILE* file;
const double a=1.25;
float x, e;
int i;
char sir1[20], sir2[20];
// deschide fisierul in scriere
file = fopen("rez.txt", "w");
// scrie capul de tabel
fprintf(file, " x e(x)\n");
// scrie rezultatele in fisier
for(i = 0; i <= 5; i++)
{
x = 1 + i * 0.2;
e = (a + x * x) / (1 + 3 * x);
fprintf(file, "%3.1f %f \n", x ,e);
}
fclose(file);
// deschide fisierul in citire
file = fopen("rez.txt", "r");
// citeste capul de tabel
fscanf(file, "%s %s",sir1,sir2);
printf("%s %s\n",sir1,sir2);
// citeste fisierul
for(i = 0; i<= 5; i++) {
fscanf(file, "%s %s",sir1,sir2);
printf("%s %s\n",sir1,sir2);
}
fclose(file);
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
La scrierea rezultatelor în fişier, valorile x şi e(x) sunt separate de spaţii. La citire un şir de caractere se termină la primul spaţiu. In consecinţă, valorile x şi e(x) se vor citi în două varaibile tip şir de caractere
fscanf(file, "%s %s",sir1,sir2);
Problema 3 . Să se scrie un program care să determine dimensiunea în octeţi a unui fişier. Aceasta se face citind fişierul şi numărând octeţii citiţi. Citirea secvenţială a unui fişier se face cu instrucţiunea while. Programul ce rezolvă problema este următorul.
#include
int main()
{
char name[80];
printf("introduceti numele fisierului\n");
scanf("%s", name);
FILE* file;
// deschide fisierul
file = fopen(name, "r");
char car;
int nb = 0;
car = fgetc(file);
while(car != EOF)
{
nb = nb + 1;
car = fgetc(file);
}
fclose(file);
printf("fisierul %s contine %d octeti\n", name, nb);
return 0;
}
Rezultatele rulării programului sunt cele de mai jos.
Dostları ilə paylaş: |