🚀 Capítulo 14: Manipulação de Arquivos e Persistência em Disco em C
🎯 Objetivos da Aula
Ao final desta aula, você será capaz de:
- Compreender o ponteiro especial de arquivo (
FILE *) da biblioteca<stdio.h>. - Abrir e criar arquivos de texto (
.txt) e binários (.dat/.bin) utilizando a funçãofopen(). - Escolher o modo de abertura correto (
"r","w","a","rb","wb"). - Gravar e ler registros de dados em arquivo para garantir a persistência dos dados após o encerramento do programa.
🧠 1. O Ponteiro de Arquivo (FILE *) e Modos de Abertura
Na linguagem C, qualquer operação de entrada e saída em arquivo requer um ponteiro do tipo FILE *.
flowchart LR Programa["Programa em Execucao C"] -->|"1. fopen(caminho, modo)"| PonteiroFile["FILE *arq (Handle)"] PonteiroFile -->|"2. fprintf() / fwrite()"| DiscoTexto["Arquivo em Disco (.txt / .dat)"] DiscoTexto -->|"3. fscanf() / fread()"| Programa Programa -->|"4. fclose(arq)"| FimFile["Arquivo Fechado & Flush realizado"]
Principais Modos de Abertura com fopen(caminho, modo):
| Modo | Descrição | Comportamento se o arquivo não existir |
|---|---|---|
"r" | Leitura (Read) de arquivo de texto | Retorna NULL (Erro de arquivo inexistente) |
"w" | Escrita (Write) em arquivo de texto | Cria o arquivo ou sobrescreve (apaga) o conteúdo anterior |
"a" | Anexo (Append) no final do arquivo de texto | Cria o arquivo ou adiciona novos dados ao final |
"rb" | Leitura de arquivo Binário | Retorna NULL |
"wb" | Escrita de arquivo Binário | Cria ou sobrescreve arquivo binário |
💻 2. Prática Guiada: Gravação e Leitura de Alunos em Arquivo
Let’s write the program persistencia_alunos.c to save and read student records in text format:
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int matricula;
char nome[50];
float media;
} Aluno;
int main() {
FILE *arquivo = NULL;
// 1. Abertura do arquivo no modo de escrita/substituição ("w")
arquivo = fopen("alunos_cadastrados.txt", "w");
if (arquivo == NULL) {
printf(">> ERRO: Nao foi possivel criar o arquivo de dados!\n");
return 1;
}
// 2. Gravando dados formatados no arquivo usando fprintf
fprintf(arquivo, "%d;%s;%.2f\n", 1001, "Carlos Silva", 8.5);
fprintf(arquivo, "%d;%s;%.2f\n", 1002, "Ana Souza", 9.2);
fprintf(arquivo, "%d;%s;%.2f\n", 1003, "Bruno Lima", 7.0);
// 3. Fechamento obrigatorio do arquivo
fclose(arquivo);
arquivo = NULL;
printf(">> Dados gravados no arquivo 'alunos_cadastrados.txt' com sucesso!\n");
// 4. Abertura no modo de leitura ("r") para verificar a gravação
arquivo = fopen("alunos_cadastrados.txt", "r");
if (arquivo == NULL) {
printf(">> ERRO: Nao foi possivel ler o arquivo!\n");
return 1;
}
printf("\n=========================================\n");
printf(" REGISTROS LIDOS DO ARQUIVO \n");
printf("=========================================\n");
int mat;
char nome[50];
float med;
// Leitura formatada das linhas usando fscanf
while (fscanf(arquivo, "%d;%49[^;];%f\n", &mat, nome, &med) != EOF) {
printf("Matricula: %d | Nome: %-15s | Media: %.2f\n", mat, nome, med);
}
printf("=========================================\n");
fclose(arquivo);
arquivo = NULL;
return 0;
}⚔️ 3. Desafios Práticos (Exercícios 30/50/20)
🥉 Nível Bronze (Fixação)
- O que acontece se abrirmos um arquivo que já possui 100 linhas de dados utilizando o modo
"w"? E se utilizarmos o modo"a"? - Para que serve a constante
EOFretornada por funções de leitura de arquivos?
🥈 Nível Prata (Aplicação)
- Escreva um programa em C que solicite uma frase ao usuário e adicione essa frase ao final de um arquivo chamado
diario.txt(modo de anexo"a"), exibindo a confirmação de gravação.
🥇 Nível Ouro (Desafio)
- Escreva um programa em C que utilize a gravação binária (
fwriteefreadcom modo"wb"e"rb") para salvar um vetor de 3 estruturasAlunono arquivo binárioalunos.date depois ler o arquivo binário direto para a memória.
💡 Gabaritos Sanfonados de Resposta
💡 Ver Gabarito do Nível Bronze
- No modo
"w", o arquivo é truncado e todo o conteúdo anterior é apagado. No modo"a", o conteúdo existente é preservado e os novos dados são gravados ao final. EOF(End Of File) indica que o ponteiro de leitura chegou ao final do arquivo.
💡 Ver Gabarito do Nível Prata & Ouro (Código C)
#include <stdio.h>
int main() {
FILE *arq = fopen("diario.txt", "a");
if (arq == NULL) return 1;
char frase[100];
printf("Digite uma frase para o diario: ");
scanf(" %[^\n]", frase);
fprintf(arq, "%s\n", frase);
fclose(arq);
printf("Frase salva com sucesso no diario!\n");
return 0;
}📚 Referências Teóricas Oficiais
- KERNIGHAN, Brian W.; RITCHIE, Dennis M.. A Linguagem de Programação C. 2ª Edição. Campus, 1989. Cap. 7 (Entrada e Saída em Arquivos).
- ISO/IEC 9899:2018. C17 Standard — Standard I/O Library (
<stdio.h>).
⬅️ Capítulo Anterior (Alocação Dinâmica) | Voltar ao Sumário | Próximo Capítulo (Listas Encadeadas) ➡️