Sunteți pe pagina 1din 0

1

FIIERE

1. SCOPUL LUCRRII
n aceast lucrare se vor studia instruciunile limbajului C specifice lucrului cu fiiere text i cu
fiiere binare.

2. BREVIAR TEORETIC

2.1. Instruciunea fopen
Prototip:
FILE
*
fopen(char
*
fileName, char
*
mode);
Exemplu:
FILE
*
fp;
fp=fopen("C:\\abc.dat","rb");
Descriere:
Este utilizat pentru a deschide fiierul al crui nume extern este dat de primul argument, n modul
specificat de al doilea argument. Este o instruciune ce se folosete att pentru fiiere text ct i pentru
fiiere binare.

2.2. Instruciunea fclose
Prototip:
int fclose(FILE
*
stream);
Exemplu:
FILE
*
fp;
fclose(fp);
Descriere:
Este folosit pentru a nchide fiierul cu numele intern dat de argumentul ei (fiier anterior deschis
cu fopen). Este o instruciune ce se folosete att pentru fiiere text ct i pentru fiiere binare.

2.3. Instruciunea fwrite
Prototip:
int fwrite(void
*
adresa, int size, int nrArticole, FILE
*
fp);
Exemplu:
int x;
FILE
*
fp;
...
fwrite(&x,sizeof(int),1,fp);
Descriere:
Scrie la poziia curent din fiierul cu numele intern fp, un numr de nregistrri dat de al treilea
argument (nrArticole), fiecare nregistrare avnd un numr de octei dat de argumentul doi (size).
nregistrrile de scris ncep de la adresa specificat de primul argument. Este o instruciune specific
fiierelor binare.

2.4. Instruciunea fread
Prototip:
int fread(void
*
adresa, int size, int nrArticole, FILE
*
fp);
Exemplu:
int x;
FILE
*
fp;
...
freadf(&x,sizeof(int),1,fp);
Descriere:
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
2

Citete n variabila a crei adres este dat de primul argument (adresa), un numr de nregistrri
din fiierul fp, ncepnd din poziia curent a pointerului de fiier. Numrul de nregistrri ce se citesc este
dat de argumentul trei (nrArticole), fiecare nregistrare avnd mrimea n octei dat de argumentul doi
(size). Este o instruciune specific fiierelor binare.

2.5. Instruciunea fseek
Prototip:
int fseek(FILE
*
stream, long offset, int referinta);
Exemplu:
fseek(fp,0,SEEK_SET);
Descriere:
Mut pointerul de fiier la o nou poziie, aflat la un offset n octei dat de argumentul doi, fa de
poziia de referin specificat de argumentul trei. Offsetul poate fi pozitiv sau negativ. Este o instruciune
specific fiierelor binare.

2.6. Instruciunea ftell
Prototip:
long ftell(FILE
*
stream);
Exemplu:
L=ftell(fp);

Descriere:
Returneaz valoarea n octei a poziiei pointerului de fiier, fa de nceputul fiierului. Este o
instruciune specific fiierelor binare.

2.7. Instruciunea fprintf
Prototip:
int fprintf(FILE
*
stream, char
*
format [, variabile, ...]);
Exemplu:
int nrCrt;
FILE
*
fp;
....
fprintf(fp,"%d",nrCrt);
Descriere:
Scrie date, sub controlul unor formate, ntr-un fiier. Este o instruciune specific fiierelor text.
Datele se scriu ncepnd de la poziia curent a pointerului de fiier.

2.8. Instruciunea fscanf
Prototip:
int fscanf(FILE
*
stream, char
*
format [, adresa, ...]);
Exemplu:
int nrCrt;
FILE
*
fp;
...
fscanf(fp,"%d",&nrCrt);
Descriere:
Citete date dintr-un fiier, sub controlul unor formate. Este o instruciune specific fiierelor text.
Datele se citesc ncepnd de la poziia curent a pointerului de fiier.

2.9. Instruciunea fgetc
Prototip:
int fgetc(FILE
*
stream);
Exemplu:
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
3

FILE
*
fp;
int c;
...
c=fgetc(fp);

Descriere:
Citete caracterul de pe poziia curent, dintr-un fiier. Este o instruciune specific fiierelor text.

3. DESFURAREA LUCRRII
Se vor edita i apoi executa programele descrise n continuare.

Programul nr. 1
S se creeze prin program urmtorul fiier text, ce conine 10 linii a cte 10 numere fiecare. ntre cifrele
de pe o linie sunt 2 blank-uri.

0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 3 3 3 3 3
4 4 4 4 4 4 4 4 4 4
5 5 5 5 5 5 5 5 5 5
6 6 6 6 6 6 6 6 7 7
8 8 8 8 8 8 8 8 8 8
9 9 9 9 9 9 9 9 9 9

Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
FILE
*
fp;
int i,j;

clrscr( );
fp=fopen("c:\\cifre.txt","wt");
if(fp==NULL){
printf("Nu se poate crea fisierul c:\\cifre.txt !");
getch( );
exit(1);}
for(i=0;i<=9;i++){
for(j=1;j<=10;j++)fprintf(fp," %d",i);
//trece la linia urmatoare:
fprintf(fp,"\n");
}//end for i
fclose(fp);
printf("A fost creat fisierul c:\\cifre.txt . ");
getch( );
}

Programul nr. 2
S se afle suma numerelor dintr-un fiier text de numere ntregi.
Sursa programului:
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
4

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NUME_F "c:\\numere.txt" //numele fisierului text:
void main(void)
{
FILE
*
fp;
int rez; //rezultatul intors de functia fscanf
int nrCrt;
int suma;
clrscr();
//se deschide fisierul text, pentru citire:
fp=fopen(NUME_F,"rt");
if(fp==NULL){
printf("Nu se poate deschide fisier !"); getch(); exit(1);}
suma=0;
/* SE REPETA
se citesc pe rand,toate numerele din fisier, adaugandu-se
fiecare numar la suma totala
PANA CAND se atinge sfarsitul de fisier */
for(;;){
rez=fscanf(fp,"%d",&nrCrt);
if(rez==EOF)break; //s-a atins sfarsit de fisier
suma=suma+nrCrt;}
printf(Suma=%d,suma);
}

Programul nr. 3
S se concateneze doua fiiere text, ntr-un al treilea fiier text.


Sursa programului:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
void main()
{
int c;
clrscr();
FILE *fp1=fopen("c:\\a.txt","rt");
if (fp1==NULL) exit(1);
FILE *fp2=fopen("c:\\b.txt","rt");
if (fp2==NULL) exit(1);
FILE *fp3=fopen("c:\\ab.txt","wt");
if (fp3==NULL) exit(1);
//copiem pe primul, in al treilea:
for(;;){
c=fgetc(fp1);
if (c==EOF) break;
fputc(c,fp3);}
//copiem pe al doilea, in continuarea celui de-al treilea:
for(;;){
c=fgetc(fp2);
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
5

if (c==EOF) break;
fputc(c,fp3);}
fclose(fp1);
fclose(fp2);
fclose(fp3);
}

Programul nr. 4
Se citesc de la tastatur 20 de numere ntregi care se memoreaz ntr-o matrice A de 4 linii i 5 coloane.
S se copieze coninutul matricii ntr-un fiier text ce are acelai format ca i matricea (4 linii i 5 coloane
).
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
FILE
*
fp;
int i,j;
int A[4][5];

clrscr( );
for(i=0;i<4;i++)
for(j=0;j<5;j++){
printf("Numarul %d = ",5
*
i+j);
scanf("%d",&A[i][j]);}
fp=fopen("c:\\A_4_5.txt","wt");
if(fp==NULL){
printf("Nu se poate crea fisierul C:\\A_4_5.txt !");
getch( );
exit(1);}
for(i=0;i<4;i++){
for(j=0;j<5;j++)fprintf(fp," %d",A[i][j]);
//trece la linia urmatoare:
fprintf(fp,"\n");
}//end for i
fclose(fp);
printf("A fost creat fisierul c:\\A_4_5.txt . ");
getch( );
}

Programul nr. 5
S se creeze prin program, N fiiere text de numere cu valorile 1 sau +1, obinute aleator. Fiecare fiier
conine NL linii i NC coloane. Parametrii N, NL i NC se citesc de la tastatur. Primul fiier va avea
numele: C:\date1.txt, al doilea: C:\date2.txt, al treilea: C:\date3.txt, .a.m.d.
Exemplu:
Pentru NL=2 i NC=5 , un fiier tipic creat prin program, este de forma:
1 -1 -1 -1 1
-1 1 -1 -1 -1
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
6

#include <string.h>
void main(void)
{
int NL;//numarul de linii din fisier
int NC;//numarul de coloane din fisier
int N;//numarul de fisiere
int i,j,k;
char numeCrt[81];
char strNrCrt[7];
FILE * fp;
clrscr();
printf(N=);
scanf(%d,&N);
printf(NL=);
scanf(%d,&NL);
printf(NC=);
scanf(%d,&NC);
randomize();
//se construiesc cele N fisiere:
for(i=1;i<=N;i++){
//obtinerea numelui extern al fisierului numarul i:
//conversia valorii intregi i, in string:
itoa(i,strNrCrt,10);//al treilea parametru este baza de numeratie
//a primului parametru (i)
strcpy(numeCrt,"C:\\date");
strcat(numeCrt,strNrCrt);
strcat(numeCrt,".txt");
fp=fopen(numeCrt,"wt");
if(fp==NULL){
printf("\n Nu se poate deschide fisierul nr. %d",1);
getch(); exit(1);}
//scrierea celor NLxNC numere aleatoare in fisierul curent, i:
for(j=0;j<NL;j++){
for(k=0;k<NC;k++)
if(random(2)==0)fprintf(fp,"-1 ");
else fprintf(fp," 1 ");
//se trece la urmatoarea linie:
fprintf(fp,"\n");
}//end for j
//inchiderea fisierului curent:
fclose(fp);
}//end for i }
Programul nr. 6
S se creeze prin program un fiier binar ce conine urmtorii 100 de octei: 10 octei de valoare 0, 10
octei de valoare 1, ..., 10 octei de valoare 9.
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
FILE
*
fp;
int i,j;
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
7


clrscr( );
fp=fopen("c:\\cifre.bin","wb");
if(fp==NULL){
printf("Nu se poate crea fisierul c:\\cifre.bin !");
getch( );
exit(1);}
for(i=0;i<=9;i++)
for(j=1;j<=10;j++)fwrite(&i,1,1,fp);
fclose(fp);
printf("A fost creat fisierul c:\\cifre.bin . ");
getch( );
}

Programul nr. 7
S se adauge la sfritul unui fiier existent, un octet de paritate calculat ca suma modulo 2 a t uturor
octeilor din fiierul iniial.
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
void main(void)
{
FILE
*
fp;
int i;
int L; //lungimea in octeti a fisierului initial
unsigned char octetCrt;//octetul curent citit din fisier
unsigned char octetCalculat;
clrscr( );
fp=fopen("abc.dat","r+b");
if(fp==NULL){
printf("Nu pot deschide fisierul abc.dat !");
getch( );
exit(1);}
fseek(fp,0,SEEK_END);
L=ftell(fp);
fseek(fp,0,SEEK_SET);
octetCalculat=0;
for(i=0;i<L;i++){
fread(&octetCrt,1,1,fp);
octetCalculat=octetCalculat ^ octetCrt;
}
fseek(fp,0,SEEK_END); //Fara aceasta instructiune, scrie la sfarsitul //fisierului, un octet de alta
valoare, nu cel specificat prin fwrite !
//(Nu se poate in modul r+, ca imediat dupa o operatie de read sa
// urmeze una de write.)
fwrite(&octetCalculat,1,1,fp);
fclose(fp);
clrscr( );
//Verificarea:
fp=fopen("abc.dat","rb");
for(i=0;i<L+1;i++){
fread(&octetCrt,1,1,fp);
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
8

printf("\n%d",octetCrt);}
fclose(fp);
getch( );
}

Programul nr. 8
Se va crea prin program un fiier binar "ran.bin", ce conine 200 de numere, generate ca numere aleatoare,
n gama 0..255 .
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NUME_F "ran.bin"
#define NR_VALORI 200
void main(void)
{

FILE
*
fp;
int i;
unsigned char nrCrt;
clrscr( );
randomize( );
fp=fopen(NUME_F,"wb");
if(fp==NULL){
printf("Nu pot deschide fisier !");
getch( );
exit(1);}
for(i=0;i<NR_VALORI;i++){
nrCrt=random(256);
fwrite(&nrCrt,sizeof(unsigned char),1,fp);}//for
fclose(fp);
printf("\n S-a creat fisierul specificat !");
getch( );
}

Programul nr. 9
S se calculeze i afieze maximul dintr-un fiier binar de octei. Pentru testare se va folosi fiierul
"ran.bin", creat prin programul anterior.
Sursa programului:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define NUME_F "ran.bin"
void main(void)
{
FILE
*
fp;
int i;
unsigned char nrCrt;
int L;
clrscr( );
fp=fopen(NUME_F,"rb");
if(fp==NULL){
printf("Nu pot deschide fisier !");
L
a
b
o
r
a
t
o
r

1
2

P
C
L
P
9

getch( );
exit(1);}
//afla lungimea fisierului:
fseek(fp,0,SEEK_END);
L=ftell(fp);
if(L==0){
printf("\nFisierul este gol !");getch( );exit(1);}
//readuce pointerul de fisier la inceputul fisierului:
fseek(fp,0,SEEK_SET);
fread(&maxim,1,1,fp);//initializeaza maximul cu primul numar din //fisier
//citeste octet cu octet tot fisierul
for(i=1;i<L;i++){
fread(&nrCrt,1,1,fp);
if(nrCrt > maxim)maxim=nrCrt;}
fclose(fp);
printf("\n Maximul gasit este: %d",maxim);
getch( );
}

4. PROBLEME PROPUSE
1. S se scrie programul prin care un fiierul oarecare este citit i afiat pe ecran, octet cu octet.
2. S se afieze cea mai lung linie dintr-un fiier text.
3. Se d un fiier text de numere ntregi. S se calculeze cel mai mare divizor comun al acestor
numere.
4. S se calculeze i afieze numrul de valori nule dintr-un fiier binar de octei.
5. S se creeze un fiier binar, ce are numele C:\elevi.dat, n care sunt copiate datele citite de la
tastatur, pentru toi elevii unei clase. Pentru fiecare elev, se citesc urmtoarele informaii:
- numele
- prenumele
- media





L
a
b
o
r
a
t
o
r

1
2

P
C
L
P

S-ar putea să vă placă și