Arquivos - Cursor - Programação 1 - Engenharia

De MediaWiki do Campus São José
Revisão de 13h21min de 7 de novembro de 2018 por 127.0.0.1 (discussão) (Criou página com '==Objetivos== *posicionamento de cursor em arquivos *Modificador de acesso ''const'' *Classes de armazenamento ==Ainda funções de acesso a arquivos== A localização corrent...')
(dif) ← Edição anterior | Revisão atual (dif) | Versão posterior → (dif)
Ir para navegação Ir para pesquisar

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.