🚀 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:

  1. Compreender o ponteiro especial de arquivo (FILE *) da biblioteca <stdio.h>.
  2. Abrir e criar arquivos de texto (.txt) e binários (.dat / .bin) utilizando a função fopen().
  3. Escolher o modo de abertura correto ("r", "w", "a", "rb", "wb").
  4. 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):

ModoDescriçãoComportamento se o arquivo não existir
"r"Leitura (Read) de arquivo de textoRetorna NULL (Erro de arquivo inexistente)
"w"Escrita (Write) em arquivo de textoCria o arquivo ou sobrescreve (apaga) o conteúdo anterior
"a"Anexo (Append) no final do arquivo de textoCria o arquivo ou adiciona novos dados ao final
"rb"Leitura de arquivo BinárioRetorna NULL
"wb"Escrita de arquivo BinárioCria 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)

  1. O que acontece se abrirmos um arquivo que já possui 100 linhas de dados utilizando o modo "w"? E se utilizarmos o modo "a"?
  2. Para que serve a constante EOF retornada por funções de leitura de arquivos?

🥈 Nível Prata (Aplicação)

  1. 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)

  1. Escreva um programa em C que utilize a gravação binária (fwrite e fread com modo "wb" e "rb") para salvar um vetor de 3 estruturas Aluno no arquivo binário alunos.dat e depois ler o arquivo binário direto para a memória.

💡 Gabaritos Sanfonados de Resposta

💡 Ver Gabarito do Nível Bronze
  1. 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.
  2. 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) ➡️