Por: Eduardo Casavella
Arquivos
Os arquivos permitem gravar os dados de um programa de forma permanente em mídia digital.
Vantagens de utilizar arquivos
- Armazenamento permanente de dados: as informações permanecem disponíveis mesmo que o programa que as gravou tenha sido encerrado, ou seja, podem ser consultadas a qualquer momento.
- Grande quantidade dados pode ser armazenada: A quantidade de dados que pode ser armazenada depende apenas da capacidade disponível da mídia de armazenamento. Normalmente a capacidade da mídia é muito maior do que a capacidade disponível na memória RAM.
- Acesso concorrente: Vários programas podem acessar um arquivo de forma concorrente.
A linguagem C trata os arquivos como uma sequência de bytes. Esta sequência pode ser manipulada de várias formas e para tanto, existem funções em C para criar, ler e escrever o conteúdo de arquivos independente de quais sejam os dados armazenados.
Tipos de arquivos
Em C trabalhamos com dois tipos de arquivos:
1) Arquivo texto: Armazena caracteres que podem ser mostrados diretamente na tela ou modificados por um editor de texto.
Exemplos de arquivos texto: documentos de texto, código fonte C, páginas XHTML.
2) Arquivo binário é uma sequência de bits que obedece regras do programa que o gerou.
Exemplos: Executáveis, documentos do Word, arquivos compactados.
O ponteiro para arquivo
Em C, o arquivo é manipulado através de um ponteiro especial para o arquivo.
A função deste ponteiro é “apontar” a localização de um registro.
Sintaxe:
FILE < *ponteiro >
O tipo FILE está definido na biblioteca stdio.h.
Exemplo de declaração de um ponteiro para arquivo em C:
FILE *pont_arq;
Lembrando que FILE deve ser escrito em letras maiúsculas.
Operações com arquivos do tipo texto
Abertura de arquivos.
Para trabalhar com um arquivo, a primeira operação necessária é abrir este arquivo.
Sintaxe de abertura de arquivo:
< ponteiro > = fopen(“nome do arquivo”,”tipo de abertura”);
A função fopen recebe como parâmetros o nome do arquivo a ser aberto e o tipo de abertura a ser realizado.
Depois de aberto, realizamos as operações necessárias e fechamos o arquivo.
Para fechar o arquivo usamos a função fclose.
Sintaxe de fechamento de arquivo
fclose< ponteiro >;
Lembrando que o ponteiro deve ser a mesma variável ponteiro associada ao comando de abertura de arquivo.
Tipos de abertura de arquivos
r: Permissão de abertura somente para leitura. É necessário que o arquivo já esteja presente no disco.
w: Permissão de abertura para escrita (gravação). Este código cria o arquivo caso ele não exista, e caso o mesmo exista ele recria o arquivo novamente fazendo com que o conteúdo seja perdido. Portanto devemos tomar muito cuidado ao usar esse tipo de abertura.
a: Permissão para abrir um arquivo texto para escrita(gravação), permite acrescentar novos dados ao final do arquivo. Caso não exista, ele será criado.
Exemplo de criação de arquivos.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
// criando a variável ponteiro para o arquivo
FILE *pont_arq;
//abrindo o arquivo
pont_arq = fopen("arquivo.txt", "a");
// fechando arquivo
fclose(pont_arq);
//mensagem para o usuário
printf("O arquivo foi criado com sucesso!");
system("pause");
return(0);
}
Tela de execução
Problemas na abertura de arquivos
Na prática, nem sempre é possível abrir um arquivo. Podem ocorrer algumas situações que impedem essa abertura, por exemplo:
- Você está tentando abrir um arquivo no modo de leitura, mas o arquivo não existe;
- Você não tem permissão para ler ou gravar no arquivo;
- O arquivo está bloqueado por estar sendo usado por outro programa.
Quando o arquivo não pode ser aberto a função fopen retorna o valor NULL.
Tratando erro ao abrir o arquivo
É altamente recomendável criar um trecho de código a fim de verificar se a abertura ocorreu com sucesso ou não.
Exemplo:
if (pont_arq == NULL)
{
printf("ERRO! O arquivo não foi aberto!\n");
}
else
{
printf("O arquivo foi aberto com sucesso!");
}
Gravando dados em arquivos
A função fprintf armazena dados em um arquivo. Seu funcionamento é muito semelhante ao printf, a diferença principal é a existência de um parâmetro para informar o arquivo onde os dados serão armazenados.
Sintaxe:
fprintf(nome_do_ponteiro_para_o_arquivo, “%s”,variavel_string)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *pont_arq; // cria variável ponteiro para o arquivo
char palavra[20]; // variável do tipo string
//abrindo o arquivo com tipo de abertura w
pont_arq = fopen("arquivo_palavra.txt", "w");
//testando se o arquivo foi realmente criado
if(pont_arq == NULL)
{
printf("Erro na abertura do arquivo!");
return 1;
}
printf("Escreva uma palavra para testar gravacao de arquivo: ");
scanf("%s", palavra);
//usando fprintf para armazenar a string no arquivo
fprintf(pont_arq, "%s", palavra);
//usando fclose para fechar o arquivo
fclose(pont_arq);
printf("Dados gravados com sucesso!");
getch();
return(0);
}
Tela de execução
Gravando caracter por caracter em um arquivo com fputc
A função fputc() escreve um único caractere em um arquivo.
Na prática temos que a cada chamada da função fputc grava um caraceter no arquivo.
Vamos ver o código usando putc() a seguir.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *pont_arq;
char frase[50];
int i;
int tamanho;
pont_arq = fopen("arquivo1.txt","w");
if (pont_arq == NULL)
{
printf("Erro ao tentar abrir o arquivo!");
exit(1);
}
printf("Digite a frase a ser gravada no arquivo:");
gets(frase);
//verificando a quantidade de caracteres da string frase
tamanho=strlen(frase);
//gravando caracter por caracter
for(i=0; i < tamanho; i++)
{
fputc(frase[i], pont_arq);
}
fclose(pont_arq);
return 0;
}
Função fputs() para escrita em arquivos
A função fputs() é usada para gravar strings em arquivos.
A função fputs recebe como parâmetro uma string e um ponteiro para o arquivo a ser escrito.
Retorno da função fputs:
- se a string for gravada com sucesso, retorna um inteiro diferente de zero.
- Caso ocorra algum erro na escrita, o valor da constante EOF é retornado.
Vejamos a seguir um exemplo prático de utilização
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *pont_arq;
int r;
pont_arq = fopen("arquivo2.txt", "w");
//Testando a abertura do arquivo
if (pont_arq == NULL)
{
printf("Erro ao tentar abrir o arquivo!");
exit(1);
}
//Gravando strings no arquivo
r = fputs("Programando em Linguagem C.", pont_arq);
//Verificando se os dados foram gravados com sucesso
if( r == EOF)
{
printf("Erro ao tentar gravar os dados! \n");
}
else
{
printf("Dados gravados com sucesso. \n");
}
//fechando o arquivo
fclose(pont_arq);
return 0;
}
Leitura de arquivos
Leitura caracter por caracter – Função fgetc()
A função fgetc() faz a leitura de um caracter no arquivo.
Sintaxe:
fgetc(ponteiro_do_arquivo);
Para realizar a leitura de um arquivo inteiro caracter por caracter podemos usar fgetc dentro de um laço de repetição.
do
{
//faz a leitura do caracter no arquivo apontado por pont_arq
c = fgetc(pont_arq);
//exibe o caracter lido na tela
printf("%c" , c);
}while (c != EOF);
A leitura será realizada até que o final do arquivo seja encontrado.
Veja o código do exemplo a seguir.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *pont_arq;
char c;
pont_arq = fopen("arquivo1.txt","r");
if (pont_arq == NULL)
{
printf("Erro ao tentar abrir o arquivo!");
exit(1);
}
printf("Lendo e exibindo os dados do arquivo \n\n");
//Faça
do
{
//faz a leitura do caracter no arquivo apontado por pont_arq
c = fgetc(pont_arq);
//exibe o caracter lido na tela
printf("%c" , c);
}while (c != EOF);//enquanto não for final de arquivo
fclose(pont_arq);//fechando o arquivo
system("pause");//pausa na tela, somente para Windows
return(0);
}
Leitura de strings – Função fgets()
É utilizada para leitura de strings em um arquivo. Realiza a leitura dos caracteres até o final da linha quando encontra o caracter \n. A leitura é efetuada de tal forma que a string lida é armazenada em um ponteiro do tipo char. A função pode ser finalizada quando encontrar o final do arquivo, neste caso retorna o endereço da string lida. Se ocorrer algum erro na leitura do arquivo, a função retorna NULL.
//Leitura de arquivo
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *pont_arq;
char texto_str[20];
//abrindo o arquivo_frase em modo "somente leitura"
pont_arq = fopen("arquivo_palavra.txt", "r");
//enquanto não for fim de arquivo o looping será executado
//e será impresso o texto
while(fgets(texto_str, 20, pont_arq) != NULL)
printf("%s", texto_str);
//fechando o arquivo
fclose(pont_arq);
getch();
return(0);
}
Tela de execução
Arquivos binários em Linguagem C
Arquivos binários são interessantes quando é necessário tratar grande volume de dados, com modificações frequentes, nesse tipo de aplicação eles são mais velozes do que os arquivos do tipo texto e ocupam menos espaço em disco.
Tipos de abertura de arquivos binários
| Tipo de abertura | Significado |
| rb | Abre um arquivo binário que já existe para leitura. Caso o arquivo não exista, retorna um erro. |
| w+b | Abre um novo arquivo binário para gravação. Caso o arquivo já exista será sobrescrito na gravação. |
| a+b | Abre um arquivo binário para adicionar dados. |
| r+b | Abre um arquivo binário que já existe para leitura e gravação. Caso o arquivo não exista, retorna um erro. |
| w+b | Abre um novo arquivo binário para leitura e gravação. Caso o arquivo já exista será sobrescrito na gravação. |
| a+b | Abre um arquivo binário para adicionar dados. Caso o arquivo não exista, será criado um novo arquivo. |
Usando frwite() em C
Vejamos a seguir como criar um arquivo binário e armazenar dados dentro dele usando usando a função fwrite() da linguagem C.
/* Testando a função fwrite - Grava um arquivo binário contendo
2 vetores de 15 elementos cada um: O primeiro vetor armazena
caracteres e o segundo armazena dados inteiros */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch [15] = "Teste geral";
int valor [15] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
FILE *ptarq;
ptarq = fopen ("binario.bin", "wb"); //Se não abriu, cria.
if (ptarq!=NULL)
printf ("n\nArquivo binario.bin foi aberto com sucesso\n");
else
{
printf ("\n\nErro: O arquivo binario.bin não foi aberto\n");
system ("pause");
exit (0);
}
//Gravando os dados no arquivo usando a função fwrite
fwrite (ch, sizeof (char), 15, ptarq);
fwrite (valor, sizeof(int), 15, ptarq);
//Fechando o arquivo
fclose (ptarq);
system ("pause");//pausa na tela, somente para Windows
return(0);
}
Leitura de arquivos binários em C
Agora vamos usar a função fread() para fazer a leitura de dados em arquivo binário.
/* Testando a função fread - Lê um arquivo binário contendo
2 vetores de 15 elementos cada um: O primeiro vetor é de
caracteres e o segundo é de variáveis inteiras */
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char ch [15];
int valor [15], i=0;
//ponteiro para o arquivo
FILE *ptrArq;
//abertura do arquivo
ptrArq = fopen("binario.bin","rb");
//testando se o arquivo foi aberto com sucesso
if (ptrArq != NULL)
printf ("\n\nArquivo binario.bin foi aberto com sucesso\n\n");
else
{
printf ("\n\nERRO: O arquivo binario.bin não foi aberto e criado\n");
system ("pause");
exit (1);
}
//leitura do arquivo binário
//Sintaxe: fread(&variavel, num_bytes, num_registros, arquivo);
//retorna o conteúdo contido em uma ocorrência do tamanho da variável ch.
fread(ch, sizeof(ch),1,ptrArq);
//retorna o conteúdo contido em uma ocorrência do tamanho da variável valor.
fread(valor,sizeof(valor),1,ptrArq);
printf("Vetor de caracteres: \n");
for(i = 0; i < 15; i++)
{
printf("%c",ch[i]);
}
printf("\nVetor de inteiros: ");
for(i = 0; i < 15; i++)
{
printf("\n%d",valor[i]);
}
//fechando o arquivo
fclose(ptrArq);
printf("\n");
system ("pause");
return(0);
}
Até a próxima!



15 respostas a Arquivos em C