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.

Para se ter acesso ao conteúdo de um arquivo é necessário que este conteúdo seja transferido para<br />

m<strong>em</strong>ória do computador para, <strong>em</strong> seguida, ser exibido na tela pela função printf() ou impresso por uma<br />

impressora através da função fprintf() (ver<strong>em</strong>os isto numa seção seguinte). A transferência do conteúdo de<br />

um arquivo para m<strong>em</strong>ória pode ser feita registro a registro, armazenando cada um deles <strong>em</strong> uma estrutura, ou<br />

através de um conjunto de registros, armazenando-o num vetor de estruturas. Aqui optar<strong>em</strong>os pela primeira<br />

alternativa.<br />

A transferência de registros de um arquivo para a m<strong>em</strong>ória é feita através da função fread() que, como<br />

a função fwrite(), possui quatro parâmetros:<br />

1. Um ponteiro para uma variável do tipo void que receberá o endereço da variável que armazenará os<br />

dados contidos no registro;<br />

2. Um inteiro que receberá o tamanho, <strong>em</strong> bytes, da estrutura que armazenará o registro na m<strong>em</strong>ória;<br />

3. Um inteiro que receberá o número de registros que serão transferidos para a m<strong>em</strong>ória (com a opção<br />

aqui escolhida este parâmetro s<strong>em</strong>pre será igual a 1);<br />

4. Um ponteiro de arquivo que receberá o fluxo associado, através da função fopen(), ao arquivo de<br />

disco que contém os registros.<br />

Para que seja possível a aplicação da função fread() é necessário que o arquivo esteja "aberto para<br />

leitura", o que é feito também através da função fopen() agora com segundo parâmetro "rb". Quando é feita<br />

uma chamada da função fopen() com os argumentos Nome do Arquivo e "rb", o primeiro registro do arquivo<br />

fica disponível para leitura (registramos este fato dizendo que o ponteiro de leitura e gravação aponta para o<br />

primeiro registro).<br />

Considerando-se que após a execução da função fread() o ponteiro de leitura e gravação avança<br />

automaticamente para o próximo registro, pode-se percorrer todo o arquivo até atingir o seu final, que é<br />

fornecido pela função feof(). Esta função t<strong>em</strong> como parâmetro um ponteiro de arquivo e retorna um número<br />

diferente de zero quando o ponteiro de leitura e gravação aponta para o final do arquivo.<br />

Por ex<strong>em</strong>plo, pode-se exibir na tela o conteúdo do arquivo gerado acima através da seguinte função.<br />

/*Função que exibe na tela o conteúdo de um arquivo */<br />

void ExibeArquivo(char s[12])<br />

{<br />

FILE *p;<br />

struct TRegistro r;<br />

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

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

while (feof(p) == 0)<br />

/*Ou, o que é o mais utilizado, while (!feof(p))*/<br />

{<br />

printf("%s \b %s \b %f \n", r.Mat, r.Nome, r.SalarioBruto);<br />

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

}<br />

fclose(p);<br />

}<br />

Verificando a existência de um arquivo<br />

A ativação de fopen() no modo "rb" (o segundo parâmetro de fopen() é chamado modo de abertura do<br />

arquivo) permite que se escreva uma função para verificar a existência de um arquivo, que será útil para<br />

evitar uma ativação "desastrada" de fopen(), já que, como diss<strong>em</strong>os acima, a ativação desta função no modo<br />

"wb" apaga todo o conteúdo do arquivo que possuir o nome passado para o primeiro parâmetro desta função.<br />

Isto implica a necessidade de que se tenha cuidado na abertura de um arquivo no modo "wb", pois se for<br />

passado um nome de um arquivo que já existe todo o seu conteúdo será perdido. É prudente, portanto, que a<br />

abertura de um arquivo no modo aqui discutido seja precedida de uma função que verifique se um arquivo<br />

com o nome escolhido já existe. Uma função com este objetivo é bastante simples, pois a função fopen()<br />

retorna NULL se for ativada no modo "rb" com o arquivo que não existe.<br />

int ExisteArquivo(char s[12])

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

Saved successfully!

Ooh no, something went wrong!