Sunteți pe pagina 1din 2

tail #include <stdio.h> #include <stdlib.

h> char char FILE * int int unsigned int unsigned int long int * head1[] = {"\n------- \""}; head2[] = {" -------\n"}; pf; filenum; cc; numlin = 10; indx; tail;

void getnumlin(int n, char * str[]) /*Functia care numara liniile*/ { for (--n; n; --n) { ++str; if ((**str == '/') || (**str == '-')) { numlin = atoi(*(str) + 1); if (numlin <= 0) numlin = 10; } } /*din cauza ca se salveaza un pointer la sfarsitul liniei anterioare */ numlin ++; } /* se schimba pointerul "pf" cu "numlin - 1" linii inainte de sfarsitul fisierului */ void gettail(void) /*Functia pentru tail*/ { unsigned char outstr[15]; unsigned long int lincur = 0L; /*linia curenta*/ tail = (long int *)malloc(sizeof(*tail) * numlin); if (!tail) { fputs("Memorie insuficienta.", stderr); exit(1); } tail[0] = ftell(pf); indx = 0; for (cc = getc(pf); cc != EOF; cc = getc(pf)) { if (cc == '\r') /* '/r' este un caracter de control care muta cursorul la inceputul urmatoarei linii */ { ++lincur; cc = getc(pf); if (cc != '\n') ungetc(cc, pf); ++indx; indx %= numlin; tail[indx] = ftell(pf); } else { if (cc == '\n') { ++lincur; cc = getc(pf); if (cc != '\r') ungetc(cc, pf); ++indx; indx %= numlin; tail[indx] = ftell(pf); } } } fputs("\" ", stderr); ltoa(lincur, outstr, 10); fputs(outstr, stderr); fputs(" lines", stderr); if (lincur >= numlin - 1) { indx++; indx %= numlin; } else indx = 0; Page 1

tail if (fseek(pf, tail[indx], 0) == -1) { fputs("\n Eroare cautare fisier.", stderr); exit(1); } free(tail); } /* Se creaza o functie care numara liniile, se creaza un pointer care se salveaza la sfarsitul fiecarei linii citite; se foloseste caracterul de control '/r' care muta cursorul la inceputul urmatoarei linii; */

Page 2

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