Arquivos - Cursor - Programação 1 - Engenharia
Objetivos
- posicionamento de cursor em arquivos
- Modificador de acesso const
- Classes de armazenamento
Ainda funções de acesso a arquivos
A localização corrente do acesso a um arquivo pode ser modificada antes de uma leitura ou escrita. Tipicamente, quando se abre uma arquivo para leitura/escrita, o "cursor" de acesso é 0, ou seja início do arquivo. Se o arquivo for aberto em modo append, o "cursor" é posicionado no final. A cada acesso (leitura ou esrita), este cursor é incrementado conforme o número de dados lidos ou escritos.
É possível entretanto modificar a posição deste cursor, tipicamente com as funções fseek() e rewind(). (ver http://www.gnu.org/software/libc/manual/html_node/File-Positioning.html#File-Positioning)
Considere o programa abaixo que escreve um vetor de 100 inteiros em um arquivo.
#include <stdio.h>
int x[100];
void main()
{
FILE *fp;
fp = fopen("teste.dat","w");
x[0]=32;
x[90]=11;
fwrite(x, sizeof(int),100,fp);
fclose(fp);
}
Note que o vetor, sendo uma variável global não inicialiazada, será zerado pelo procedimento de startup do programa. Entretanto, a posição 90 recebe um valor (11).
Agora observe o programa seguinte que lê especificamente a posição 90 e na sequência restabelece o cursor no início. Note que o fread lê somente um inteiro na posição corrente do arquivo. A posição corrente foi determinada por fseek e depois retornada para o início com rewind.
#include <stdio.h>
int y;
void main()
{
FILE *fp;
fp = fopen("teste.dat","r");
fseek(fp, 90*sizeof(int), SEEK_CUR);
fread(&y, sizeof(int),1,fp);
printf("y=%d\n", y);
rewind(fp);
fread(&y, sizeof(int),1,fp);
printf("y=%d\n", y);
fclose(fp);
}
Execício
Considero o programa abaixo. Ele deve acessar uma tabela que se encontra em um arquivo binário. Cada item da tabela se apresenta conforme o registro TRegistro. Implemente a função LerTab e crie um programa para escrever uma tabela iniciada com um tabela de 5 registros a fim de testar a função implementada.
#include <stdio.h>
struct TRegistro {
char nome[30];
int idade;
} Registro, *pAux;
struct Tregistro *LerTab()
{
}
void main()
{
pAux=LerTab(3);
if (pAux!=0) {
printf("Nome lido %s\n", pAux->nome);
}
}
Modificador de Acesso const
Este modificador aplica-se ao acesso de variáveis. Uma variável declarada com const não pode ser modificada ao longo programa (ou escopo). Muito usada em passagem de parâmetros por referência. Garante que o parâmetro não será modificado.
voi alfa (const float *p)
{
*p=11.5; /* acesso não permitido - o compilador gera erro */
}
void main()
{
float x=2.4;
alfa(&x)
}
Note que no exemplo anterior, o compilador vai gerar um erro no acesso a x através do ponteiro p.
Classes de Armazenamento
- auto
- extern
- static
- register
Ver link ufmg.
Recursividade com Funções C
Observe a função somatoria. Ela se utiliza de recursividade para solução do problema da somatória de um número.
#include <stdio.h>
int somatoria(int num)
{
int sum;
if(num>1)
return (num+somatoria(num-1));
else
return 1;
}
void main()
{
printf("somatoria = %d\n", somatoria(5));
}
Exercíco: Implementar de forma recursiva o cálculo do fatorial de um número.