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
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? [
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
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