TA 345 Informática Aplicada à Engenharia de Alimentos

Aula 12: Arquivos

Lendo e gravando arquivos em disco

Operações de arquivos de dados

As ferramentas para manuseio de entrada e saída são as funções fopen, fprintf, fgets, fclose. Todas essas funções são declaradas no arquivo de cabeçalho stdio.h. Em complemento, stdio.h define o tipo de estrutura chamado FILE que é essencial para trabalhar com arquivos de dados em C.

A função fopen abre um arquivo em disco para gravar ou ler, e cria uma estrutura de dados especial - FILE - que C utiliza internamente para descrever o arquivo.

A função fprintf grava itens de informação em um arquivo aberto, seguindo as especificações de formato que você fornece em um argumento para a função.

A função fgets lê uma string de caracteres de um arquivo aberto.

A função fclose fecha o arquivo quando as operações de entrada e saída estão completas.

Declarando um ponteiro FILE

Antes de abrir um arquivo de dados, você deve declarar uma variável ponteiro especial - um ponteiro para uma estrutura FILE - que subseqüentemente representa o arquivo em operações de entrada ou saída. FILE é um tipo de estrutura que C cria internamente para manter o controle de vários itens de informação a respeito de um arquivo aberto.

Eis como um programa utiliza essa estrutura:

A função fopen abre um arquivo e cria automaticamente uma estrutura tipo FILE na memória, descrevendo as características do arquivo. C utiliza essa estrutura enquanto o arquivo estiver aberto.

O valor de retorno da função fopen é um ponteiro para a localização da estrutura FILE na memória. Ao chamar fopen, você atribui o valor ponteiro resultante a uma variável ponteiro tipo FILE que declarou para essa finalidade em seu programa.

Funções de entrada e saída tais como fprintf e fgets, pedem essa variável ponteiro FILE como um de seus argumentos.

A variável ponteiro FILE é o identificador que representa o arquivo enquanto ele estiver aberto.

Sintaxe:

FILE *ponteirodearquivo;

Utilizando fopen para abrir um arquivo de dados para gravação

A função fopen recebe dois argumentos string - o nome em disco do arquivo que você está abrindo e uma string de caracteres indica o modo de abertura do arquivo:

fopen (nome, modo)

Nome - um nome de arquivo do DOS.(também pode incluir um nome de diretório).
Modo - especifica como o arquivo aberto será utilizado

As possibilidades para modo são: wt, at e rt.

1. O argumento de modo "wt" (write text) cria um novo arquivo de texto no disco e o abre para gravação.

2. O argumento "at" (append text) abre um arquivo de texto já existente e prepara para anexar nova informação no final do arquivo (se o arquivo ainda não existir, "at" é o mesmo que "wt").

3. O argumento "rt" (read text) abre um arquivo de texto existente para leitura.

Tenha em mente que uma chamada à função fopen retorna um importante valor de ponteiro. Parte da tarefa da função é criar uma estrutura tipo FILE que descreva o arquivo aberto. O valor de retorno de fopen é um ponteiro para a localização da estrutura na memória. Conseqüentemente, você chama normalmente fopen como parte de um comando de atribuição.

Exemplo de atribuição a variável cliwrite:;
cliwrite = fopen("CLIENTS.DAT", "at");

Com o argumento de modo at, essa chamada a fopen executa uma entre duas coisas (dependendo de o arquivo CLIENTES.DAT já existir):

Se o arquivo já existe, a função fopen o abre e prepara para anexar novos dados no final dele.

Se o arquivo não puder ser encontrado no disco, fopen o cria e prepara para gravar dados nele.

Gravando dados em um arquivo

A função fprinf tem a seguinte sintaxe:

fprintf (ponteirodearquivo, formato, valor1, valor2, valor3,...)

Ponteirodearquivo - nome da variável ponteiro tipo FILE que representa um arquivo aberto.

Formato - string de formato contendo um especificador de formato para cada item de dado que será gravado no arquivo( as opções para essa strings de formato são idênticas àquelas utilizadas com a função printf).

Os argumentos subseqüentes são os valores de dados reais que o programa enviará ao arquivo. A lista de valores de dados no comando fprintf pode incluir caracteres, strings ou valores numéricos.


Quando não houver mais dados para gravar no arquivo, utilizar a função fclose para fechar o arquivo. A função fclose exige apenas um argumento, o ponteiro FILE representando o arquivo a ser fechado:

fclose (ponteirodearquivo);

Resumindo, os comandos utilizados são:

1. FILE *pontarq char nomearq

2. printf ("Nome arquivo: "); gets (nomearq);

3. pontarq = fopen (nomearq, "wt");

4. fprintf (pontarq, "%s %n", nome núero);

5. fclose (pontarq);

6. fscanf (pontarq, "%s%n", nome número);

Utilizando fopen para abrir um arquivo de dados para leitura

O argumento rt instrui a função fopen para abrir um arquivo para leitura:

fopen (nome, "rt")

Assumindo que o arquivo existe no disco, fopen abre esse arquivo e retorna um ponteiro para uma estrutura do tipo FILE, que descreve as características do arquivo. Entretanto, se o arquivo não existir, fopen retorna um valor nulo. Para conveniência das operações de arquivo, o arquivo de cabeçalho stdio.h define uma constante simbólica denominada NULL para representar esse valor.

Utilizando fgets para leitura de dados de um arquivo

A função fgets lê uma string de um arquivo aberto.

Sintaxe:

fgets (variável, num, ponteirodearquivo);

Variável - variável string que recebe o valor da entrada.

Num - número inteiro indicando o número máximo de caracteres que fgets lerá do arquivo. Na realidade, a função lê até num - 1 caracteres do arquivo. Alternativamente, a função pára a leitura no fim da linha atual no arquivo - se o caracter de mudança de linha ocorre antes de serem lidos num - 1 caracteres.

Cada vez que um programa chama fgets, C automaticamente mantém atualizada a posição de leitura corrente no arquivo aberto. Como resultado, o programa lê seqüencialmente do início ao fim do arquivo. Quando o programa encontra o fim do arquivo, isto é, quando fgets descobre que não há mais dados para serem lidos, a função retorna o valor NULL. Após o programa ler todos os registros, uma chamada à função fclose fecha o arquivo.

/*ex18.c criação de um arquivo */

#include /* diretiva */

typedef struct { /* estrutura do arquivo */

char nome [20];

char codigo [6];

} FICHA;

FILE * fichcom;

main() /* função principal */

{ char parada; /* variáveis locais */

char nome_arquivo [20];

FICHA CADASTRO;

clrscr();

printf ("\t\t\t---CRIAÇÃO DE UM ARQUIVO---\n");

printf ("Nome do arquivo: ");

gets (nome_arquivo);

fichcom = fopen (nome_arquivo, "wt"); while (1) { printf ("Nome? [ finaliza ]:");

gets (CADASTRO.nome);

if (! strcmp(CADASTRO.nome,"")) {

printf ("Terminação pedida pelo usuário\n");

break;

} printf ("Código?"); gets (CADASTRO.codigo);

fprintf (fichcom, "%s", CADASTRO.nome); fprintf (fichcom, "%s", CADASTRO.codigo);

} fclose (fichcom); parada = getchar();

}

/*ex19.c leitura de um arquivo */

#include /* diretiva */

typedef struct { /* estrutura do arquivo */

char nome [20];

char codigo [6];

} FICHA;

FILE * fichcom;

main() /* função principal */

{ char parada, presente; /* variáveis locais */

char nome_arquivo [20];

FICHA CADASTRO;

clrscr();

printf ("\t\t\t---CONSULTA DE UM ARQUIVO---\n");

do { printf ("Qual é o nome do arquivo: ");

gets (nome_arquivo);

if (! strcmp(nome_arquivo,"")) {

printf ("Terminação pelo usuário\n");

exit(0);

} presente = access(nome_arquivo,4);

if (presente)

printf("%s não existe\n",nome_arquivo);

} while (presente);

fichcom = fopen (nome_arquivo,"rt"); while (1) { fgets(CADASTRO.nome, 10, fichcom); fgets(CADASTRO.codigo, 10, fichcom);

printf ("%s\n %s\n", CADASTRO.nome, CADASTRO.codigo);
if (feof (fichcom)) break;
} fclose (fichcom); parada = getchar(); }


Retornar ao inicio da página

Retorno à HomePage