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

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

p = fopen(s1, "rb");<br />

fread(&r, sizeof(r), 1, p);<br />

while (!feof(p) && Achou == 0)<br />

if (strcmp(s, r.Mat) == 0)<br />

{<br />

fgetpos(p, &Byte);<br />

Achou = 1;<br />

}<br />

else<br />

fread(&r, sizeof(r), 1, p);<br />

if (Achou == 0)<br />

return (-1);<br />

else<br />

return(Byte);<br />

}<br />

Como no nosso ex<strong>em</strong>plo o tamanho da estrutura é de 48 bytes (4 bytes para o campo Mat, 40 para o<br />

campo Nome e 4 para o campo SalarioBruto), se o registro pesquisado for o primeiro a função retornará 48,<br />

se o registro pesquisado for o segundo, a função retornará retorna 96, se for o terceiro, a função retornará 144<br />

e assim por diante. Se o registro não estiver no arquivo, a função retornará –1.<br />

Quando o registro é encontrado, seu conteúdo está armazenado na estrutura r. Assim, para exibir o<br />

conteúdo do registro, basta no comando if (strcmp(s, r.Mat) == 0) incluir o comando<br />

printf("Matricula: %s \n Nome: %s \n Salario: %f \n", r.Mat, r.Nome, r.SalBruto);<br />

Para escrever a função acima com a função ftell() bastaria se substituir os comando fgetpos(p, &Byte)<br />

pelo comando Byte = ftell(p).<br />

Considerando que a instrução return() interrompe a execução de uma função, a função acima poderia<br />

prescindir da variável Achou:<br />

int ConsultaRegistro1(char s[12], char s1[12])<br />

{<br />

FILE *p;<br />

struct TRegistro r;<br />

fpos_t Byte;<br />

p = fopen(s1, "rb");<br />

fread(&r, sizeof(r), 1, p);<br />

while (!feof(p))<br />

if (strcmp(s, r.Mat) == 0)<br />

{<br />

fgetpos(p, &Byte);<br />

return(Byte);<br />

}<br />

else<br />

fread(&r, sizeof(r), 1, p);<br />

return (-1);<br />

}<br />

Optamos pela primeira versão pelo fato de que exist<strong>em</strong> linguagens que não possu<strong>em</strong> instruções do tipo<br />

return() e, nestas linguagens, teríamos de escrever a função como na versão inicial.<br />

Vale observar que as funções ConsultaRegistro() acima utilizam a pesquisa sequencial. Se os registros<br />

dos arquivos estiver<strong>em</strong> ordenados pelo campo Mat poderíamos ter utilizado a pesquisa binária, que, como<br />

estudado no capítulo 7, é b<strong>em</strong> mais eficiente.<br />

Alterando o conteúdo de um registro<br />

Às vezes, há necessidade de que os dados de um registro sejam alterados. No arquivo que estamos

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

Saved successfully!

Ooh no, something went wrong!