22.10.2014 Views

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

Aprendendo a Programar Programando em Linguagem C - FSM

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

egistro zero do arquivo; a segunda, o registro apontado pelo ponteiro de leitura e gravação (registro<br />

corrente); a terceira, o final do arquivo. No caso da posição do registro ser obtida por fgetpos() ou por ftell(),<br />

o valor que deve ser passado para orig é SEEK_SET.<br />

Desta forma, para se escrever a função AlteraRegistro() escrita acima utilizando-se a função fseek()<br />

basta substituir os comandos fsetpos(p, &Byte) pelo comando fseek(p, Byte, SEEK_SET).<br />

A constante SEEK_END, a função fseek() e a função ftell() permit<strong>em</strong> determinar o tamanho, <strong>em</strong> bytes,<br />

de um arquivo. Basta posicionar o ponteiro de leitura e gravação no final do arquivo através de fseek(p, 0,<br />

SEEK_END) e obter a posição do ponteiro através de ftell(p).<br />

int TamanhoArquivo(char *s)<br />

{<br />

FILE *p;<br />

int Tamanho;<br />

p = fopen(s, "rt");<br />

fseek(p, 0, SEEK_END);<br />

Tamanho = ftell(p);<br />

fclose(p);<br />

return(Tamanho);<br />

}<br />

Com esta função é possível se determinar o número de registros de um arquivo. Basta dividir o<br />

tamanho do arquivo pelo tamanho de cada registro:<br />

int NumRegistros(char *s)<br />

{<br />

FILE *p;<br />

struct TRegistro r;<br />

p = fopen(s, "rt");<br />

return(TamanhoArquivo(s)/sizeof(r));<br />

fclose(p);<br />

}<br />

Vale observar que, da mesma forma que a chamada de fseek(p, 0, SEEK_END) posiciona o ponteiro<br />

de leitura e gravação no final do arquivo, fseek(p, 0, SEEK_SET) posiciona o tal ponteiro no início do<br />

arquivo (existe outra forma de apontar o ponteiro de leitura e gravação para o início do arquivo: rewind(p)).<br />

Incluindo novos registros num arquivo<br />

A inclusão de novos registros <strong>em</strong> um arquivo é feita de forma bastante simples, pois a função fopen()<br />

ativada no modo "ab+" abre um arquivo e permite que novos registros sejam nele gravados. Naturalmente, a<br />

inclusão de um novo registro deve ser precedida da verificação de que o tal registro já está armazenado no<br />

arquivo, o que impediria uma nova inclusão. T<strong>em</strong>os a seguinte sugestão para atingir o objetivo aqui<br />

proposto:<br />

/* Função que inclui um novo registro num arquivo */<br />

void IncluiRegistro(struct TRegistro r, char s[12])<br />

{<br />

char c;<br />

long Byte;<br />

int Tam;<br />

FILE *p;<br />

Tam = sizeof(r);<br />

Byte = ConsultaRegistro(r.Mat, s);<br />

if (Byte == -1)<br />

{<br />

p = fopen(s, "ab+");<br />

fwrite(&r, Tam, 1, p);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!