ARQUIVOS


  A memória do computador é volátil, e todos os dados contidos nela é perdido após o desligamento do computador.
  Se desejarmos manter os dados de uma aplicação vivos após o desligamento, como por exemplo, o resultado de um jogo ou os nomes de uma agenda telefônica, teremos que salvá-los em disco.
  Existem dois formatos de arquivos: o formato texto e o formato binário.
  Em arquivos no formato texto, os códigos armazenados serão interpretados como valor de entrada na tabela ASCII, de maneira a formar um texto. Assim, por exemplo, o código 65 significa a letra 'A' maiúscula. Além disso, os arquivos no formato texto são divididos em linhas, onde um caracter com um código determinado indica o fim de uma linha.
  Em arquivos binários, os códigos são a representação direta dos dados, em seu formato original. Por exemplo, um inteiro será armazenado em disco como é armazenado na memória, ou seja, com 2 bytes por número. Já o double, em seu formato de 8 bits.
  Fica evidente que o programador deverá conhecer a disposição dos dados e seus respectivos tipos na hora de recuperar a informação no disco. Caso contrário, poderemos recuperar dados de um número double em um variável do tipo inteiro, por exemplo, causando inconsistência nos dados.

  A função em C que abre um arquivo para trabalhar é:
  fopen(<nome_do_arquivo>, <parâmetros_do_arquivo>);
  No qual retorna um ponteiro para uma variável do tipo arquivo (FILE).

  Os parâmetros de abertura de um arquivo são:

  Arquivos do Tipo Texto

  Gravação de Dados em Disco

  A função fprintf é utilizada quando deseja-se enviar uma string para um arquivo de saída. Por exemplo, pode-se gravar uma frase em um arquivo texto da seguinte maneira:
#include <stdio.h>

FILE *fp;

void main(void)
{
    fp = fopen("arquivo.txt","wt");
    fprintf(fp, "O MSX ainda vive!");
    fclose(fp);
} 

  Leitura de Dados em Disco

  A leitura de textos é feita através da função "getc". Essa função lê caractere a caractere. Entretanto, é desejável ler o texto linha a linha.
  O programa abaixo implementa uma função de leitura de linha, a "readln".
#include <stdio.h>

FILE *fp;
char linha[255];

void readln(FILE *fp, char *linha)
{
  char c;
  int p=0;

  while ((c = fgetc(fp)) != EOF)
  {
    if (c == '\n')
      break;

    linha[p++] = c;
  }
}

void main(void)
{
  fp = fopen("arquivo.txt","rt");
  readln(fp, linha);
  fclose(fp);

  printf("%s\n", linha); 
}

  Arquivos do Tipo Binário

  Os arquivos de tipo binário podem ser lidos byte a byte ou por blocos.
  Observa-se que a leitura byte a byte deve ser evitada, pois o acesso ao disco repetidamente é mais caro (leva mais tempo) do que o acesso único, realizado na transferência de dados por bloco.
  Assim, temos as seguintes funções:   Sintaxe do fread / fwrite:
  fread(<variavel>, <tamanho>, <num_leituras_sequenciais>, <arquivo>);
  fwrite(<variavel>, <tamanho>, <num_leituras_sequenciais>, <arquivo>);
  Onde:
  Exemplo de abertura de arquivo binário em bloco:
#include <stdio.h>

FILE *fp;
char buffer[1024];

void main(void)
{
  fp = fopen("exemplo.bin","rb");
  fread(buffer, 1024, 1, fp);
  fseek(fp, 40, SEEK_SET);
  fclose(fp);
}
  Obs: o comando fseek move o ponteiro no arquivo (ver mais detalhes no capítulo de arquivos do Pascal). Sintaxe:
  fseek(<arquivo>, <offset>, <referência>);
  Onde:
  Gravando e Recuperando Estruturas

  O programa a seguir cria uma ficha de alunos e a salva no formato binário.
#include <stdio.h>
#include <string.h>

struct mod_ficha
{
  char nome[10];
  int idade;
  int serie;
  float cr;

} ficha;

FILE *fp;

void main(void)
{
  // Preenche ficha
  strcpy(ficha.nome, "Catarina");
  ficha.idade = 12;
  ficha.serie = 6;
  ficha.cr = 8.9;

  fp = fopen("ficha.fch","wb");
  fwrite(&ficha, sizeof(struct mod_ficha), 1, fp);
  fclose(fp);
}

  Resultado, editando o arquivo "ficha.fch" em um editor hexadecimal.
 Bytes                               | ASCII
 ------------------------------------+-------------
 43 61 74 61 72 69 6E 61 00 00 00 00 | Catarina....
 0C 00 00 00 06 00 00 00 66 66 0E 41 | ........ff.A

  Recuperando o arquivo:
#include <stdio.h>
#include <string.h>

struct mod_ficha
{
  char nome[10];
  int idade;
  int serie;
  float cr;

} ficha;

FILE *fp;

void main(void)
{
  fp = fopen("ficha.fch","rb");
  fread(&ficha, sizeof(struct mod_ficha), 1, fp);
  fclose(fp);

  printf("Nome: %s\n", ficha.nome);
  printf("Idade: %d\n", ficha.idade);
  printf("Série: %d\n", ficha.serie);
  printf("Coeficiente de rendimento: %.2f\n", ficha.cr);
}
  Saída:
  Nome: Catarina
  Idade: 12
  Série: 6
  Coeficiente de rendimento: 8.90


/MARMSX/CURSOS/C--