No sistema de entrada e saída ANSI é definido o tipo "ponteiro de arquivo". Este não é um tipo propriamente dito, mas uma definição usando o comando typedef. Esta definição está no arquivo cabeçalho stdio.h ou stdlib.h dependendo do seu compilador. Podemos declarar um ponteiro de arquivo da seguinte maneira:
FILE *p;
p será então um ponteiro para um arquivo. É usando este tipo de ponteiro que vamos poder manipular arquivos no C.
Esta é a função de abertura de arquivos. Seu protótipo é:
FILE *fopen (char *nome_do_arquivo,char *modo);
O nome_do_arquivo determina qual arquivo deverá ser aberto. Este nome deve ser válido no sistema operacional que estiver sendo utilizado. O modo de abertura diz à função fopen() que tipo de uso você vai fazer do arquivo. A tabela abaixo mostra os valores de modo válidos:
Modo |
Significado |
"r" |
Abre um arquivo para leitura |
"w" |
Cria um arquivo para escrita |
"a" |
Acrescenta dados no fim do arquivo ("append") |
"rb" |
Abre um arquivo binário para leitura |
"wb" |
Cria um arquivo binário para escrita |
"ab" |
Acrescenta dados binários no fim do arquivo |
"r+" |
Abre um arquivo para leitura e escrita |
"w+" |
Cria um arquivo para leitura e escrita |
"a+" |
Acrescenta dados ou cria uma arquivo para leitura e escrita |
"r+b" |
Abre um arquivo binário para leitura e escrita |
"w+b" |
Cria um arquivo binário para leitura e escrita |
"a+b" |
Acrescenta dados ou cria uma arquivo binário para leitura e escrita |
"rt" |
Abre um arquivo texto para leitura |
"wt" |
Cria um arquivo texto para escrita |
"at" |
Acrescenta dados no fim do arquivo texto |
"r+t" |
Abre um arquivo texto para leitura e escrita |
"w+t" |
Cria um arquivo texto para leitura e escrita |
"a+t" |
Acrescenta dados ou cria uma arquivo texto para leitura e escrita |
Poderíamos então, para abrir um arquivo binário, escrever:
FILE *fp; fp=fopen ("exemplo.bin","wb"); if (!fp) printf ("Erro na abertura do arquivo.");
A condição !fp testa se o arquivo foi aberto com sucesso porque no caso de um erro a função fopen() retorna um ponteiro nullo (NULL).
Aqui abrimos um parênteses para explicar a função exit() cujo protótipo é:
void exit (int codigo_de_retorno);
Esta função aborta a execução do programa. Pode ser chamada de qualquer ponto no programa e faz com que o programa termine e retorne, para o sistema operacional, o código_de_retorno. A convenção mais usada é que um programa retorne zero no caso de um término normal e retorne um número não nulo no caso de ter ocorrido um problema. A função exit() se torna importante em casos como alocação dinâmica e abertura de arquivos pois pode ser essencial que uma determinada memória seja alocada ou que um arquivo seja aberto. Poderíamos reescrever o exemplo da seção anterior usando agora o exit() para garantir que o programa não deixará de abrir o arquivo:
#include <stdio.h main (void) { FILE *fp; ... fp=fopen ("exemplo.bin","wb"); if (!fp) { printf ("Erro na abertura do arquivo. Fim de programa."); exit (1); } ... return 0; }
Quando abrimos um arquivo devemos fechá-lo. Para tanto devemos usar a função fclose():
int fclose (FILE *fp);
É importante que se perceba que se deve tomar o maior cuidado para não se "perder" o ponteiro do arquivo. "Perder" neste caso seria se atribuir um valor de um outro ponteiro qualquer ao ponteiro de arquivo (perdendo assim o valor original). É utilizando este ponteiro que vamos poder trabalhar com o arquivo. Se perdermos o ponteiro de um determinado arquivo não poderemos nem fechá-lo. O ponteiro fp passado à função fclose() determina o arquivo a ser fechado. A função retorna zero no caso de sucesso.