Da trilha de C Este conceito ainda não saiu como card do dia. ir para o card de hoje

C I/O Intermediário

Arquivos

Em C, a manipulação de arquivos é feita através de um ponteiro para arquivo (FILE *), obtido com fopen. Essa função abre um arquivo em um modo específico (leitura, escrita, etc.) e retorna NULL em caso de erro, que deve ser sempre verificado. Após o uso, o arquivo deve ser fechado com fclose para liberar recursos e garantir que os dados sejam gravados.

Para entrada e saída formatada, usamos fprintf e fscanf, que funcionam como printf e scanf, mas operam em arquivos. Já para dados binários ou blocos de memória, usamos fread e fwrite, que leem e escrevem um número específico de bytes.

O tratamento de erros é essencial: sempre verifique se fopen retornou NULL e se as operações de leitura/escrita foram bem-sucedidas (comparando o valor de retorno com o esperado). Ignorar esses erros pode levar a falhas silenciosas ou corrupção de dados.

Pontos-chave

  • fopen abre um arquivo e retorna um FILE *; em caso de erro, retorna NULL.
  • fclose fecha o arquivo e libera os recursos associados.
  • fprintf e fscanf realizam E/S formatada (texto) em arquivos.
  • fread e fwrite realizam E/S binária, lendo/escrevendo blocos de bytes.
  • Sempre verifique o retorno de fopen e das funções de E/S para tratar erros.
arquivos.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    // Abre arquivo para escrita
    FILE *fp = fopen("dados.txt", "w");
    if (fp == NULL) {
        perror("Erro ao abrir arquivo para escrita");
        return 1;
    }

    // Escreve dados formatados
    fprintf(fp, "%s %d\n", "idade", 30);
    fprintf(fp, "%s %d\n", "peso", 75);
    fclose(fp);

    // Abre o mesmo arquivo para leitura
    fp = fopen("dados.txt", "r");
    if (fp == NULL) {
        perror("Erro ao abrir arquivo para leitura");
        return 1;
    }

    char nome[20];
    int valor;
    // Lê e imprime cada linha
    while (fscanf(fp, "%19s %d", nome, &valor) == 2) {
        printf("%s: %d\n", nome, valor);
    }
    fclose(fp);

    return 0;
}

Exercícios

  1. 1
    Fácil

    Escrevendo e lendo um número

    Crie um programa que abra o arquivo numero.txt para escrita, grave o número inteiro 42 usando fprintf, feche o arquivo. Em seguida, abra o mesmo arquivo para leitura, leia o número com fscanf e imprima na tela. Trate possíveis erros de abertura.

    Resolver
  2. 2
    Médio

    Gravando e lendo structs com fwrite/fread

    Defina uma struct Pessoa com campos nome (string de até 50 caracteres) e idade (int). Crie um programa que:

    • Abra o arquivo pessoas.bin para escrita binária ("wb").
    • Grave 3 pessoas usando fwrite.
    • Feche o arquivo.
    • Reabra para leitura binária ("rb").
    • Leia e imprima cada pessoa usando fread. Trate erros de abertura e de leitura/escrita.

    Resolver
  3. 3
    Desafio

    Cópia de arquivo com tratamento de erros

    Implemente um programa que copie o conteúdo de um arquivo de origem para um arquivo de destino. O programa deve receber os nomes dos arquivos como argumentos de linha de comando (./copia origem destino). Use fread e fwrite para copiar em blocos de 1024 bytes. Trate todos os possíveis erros: número incorreto de argumentos, falha ao abrir origem/destino, falha na leitura/escrita. Ao final, exiba uma mensagem indicando quantos bytes foram copiados.

    Resolver

Continue estudando