Documente Academic
Documente Profesional
Documente Cultură
fclose(fc);
fclose(fd);
fclose(ff);
fclose(fc1);
fclose(fc2);
}
Exemplul 6
Scrieti un program prog.c, care va fi lansat
in executie prin comanda
prog [+-][n][LCB] fisier
valori
implicite + 10 L
Oricare din elementele primului argument
poate lipsi, caz in care se considera o
valoare implicita.
Programul scrie n unitati din fisierul
argument 2 la unitatea standard de iesire.
Exemplul 6
O unitate poate reprezenta:
o linie (L)
un caracter (C)
un bloc (B = 512 caractere)
Se vor afisa primele (+) sau ultimele (-) n unitati din fisier.
Exemple:
prog date.txt afiseaza primele 10 linii din fisier
prog date.txt afiseaza ultimele 10 linii din fisier
prog -25C date.txt afiseaza ultimele 25 de
caractere din fisier
prog +3B date.txt afiseaza primele 3 blocuri din
fisier
Exemplul 6
#include <stdio.h>
#include <ctype.h>
long posback(FILE *f, int n);
int nrlin(FILE *f);
long nrcar(FILE *f);
int main(int na, char** va)
{ enum mod{lin, car, bloc};
enum poz{fata, spate};
enum mod m;
enum poz p=fata;
FILE *f;
char linie[80];
int n=10;
int i, c;
Exemplul 6
//daca cda are 1 param.(nume fisier) se deschide
//fisierul, se citesc 10 linii care se afiseaza
if(na==2)
{ f=fopen(va[1],"r");
for(i=0; i<n; i++)
{ fgets(linie,80,f);
fputs(linie,stdout);
}
}
else
//se preia din parametru pozitia(fata/spate)
{ f=fopen(va[2],"r");
p=fata;
if(*va[1]=='-')
p=spate;
if(*va[1]=='+' || *va[1]=='-')
va[1]++; //caracterul urmator
Exemplul 6
// extrage contor
n=0;
while(isdigit(*va[1]))
{ n=10*n+(*va[1]-'0');
va[1]++;
}
if(n==0)
n=10;
//preluare tip unitate(car, bloc,linie)
if(*va[1]=='L')
m=lin;
else if(*va[1]=='C')
m=car;
else if(*va[1]=='B')
m=bloc;
Exemplul 6
else
m=lin;
if(m==lin)
{ if(p==spate)
fseek(f,posback(f,n),0);
for(i=0; i<n; i++)
{ fgets(linie,80,f);
fputs(linie, stdout);
}
}
else
{ if(m==bloc)
n*=512;
if(p==spate)
fseek(f, -n, 2);
Exemplul 6
else
fseek(f, 0, 0);
for(i=0; i<n; i++)
{
c=fgetc(f);
fputc(c,stdout);
}
}
}
}
Exemplul 6
//pozitia celei de-a n a linie din spate
long posback(FILE *f, int n)
{ int n1, c, i;
n1=nrlin(f);
char linie[80];
//ne mutam peste n1-n linii
fseek(f, 0, 0);
if(n1>n)
{ for(i=0; i<n1-n;i++)
fgets(linie,80,f);
}
return ftell(f);
}
Exemplul 6
//numar de linii din fisier
int nrlin(FILE *f)
{
int nl=0;
char linie[80];
long p=ftell(f);
rewind(f);
while(fgets(linie,80,f))
nl++;
fseek(f, p, 0);
return nl;
}
Exemplul 6
//numar de caractere din fisier
long nrcar(FILE *f)
{
long p, nc=0;
int c;
p=ftell(f);
rewind(f);
while((c=fgetc(f))!=EOF)
nc++;
fseek(f, p, 0);
return nc;
}