Spec Sistemas Com C • Trilha Progressiva em 4 Níveis


🎯 Nível 1: Fundamentos

Problema 18.1 — Leitura e Escrita de Arquivos Texto com fopen(), fputs() e fgets()

Contexto: Leitura e Escrita de Arquivos Texto com fopen(), fputs() e fgets() no contexto de Manipulação de Arquivos, Streams e Persistência Binária.

Requisitos de Execução:

  1. Gravar relatório de texto em arquivo e ler linha por linha imprimindo no console.

Resultado Esperado

Arquivo criado, preenchido e lido com fechamento seguro via fclose().

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_1_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Manipulação de Arquivos, Streams e Persistência Binária
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

int main(void) {
    FILE *f = fopen("relatorio.txt", "w");
    if (!f) return 1;
    fputs("AUDITORIA: Execucao 100% concluida.\n", f);
    fclose(f);

    char buffer[64];
    f = fopen("relatorio.txt", "r");
    if (f && fgets(buffer, sizeof(buffer), f)) {
        printf("Lido do arquivo: %s", buffer);
        fclose(f);
    }
    return 0;
}

🔍 Nível 2: Prática

Problema 18.2 — Persistência Binária de Structs com fwrite() e fread()

Contexto: Persistência Binária de Structs com fwrite() e fread() no contexto de Manipulação de Arquivos, Streams e Persistência Binária.

Requisitos de Execução:

  1. Gravar struct de cliente diretamente em arquivo binário .bin e recuperá-la na íntegra.

Resultado Esperado

Dados binários gravados e lidos com exata correspondência em memória.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_2_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Manipulação de Arquivos, Streams e Persistência Binária
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

typedef struct { int id; double saldo; } Conta;

int main(void) {
    Conta c_out = {1001, 1500.50};
    FILE *f = fopen("conta.bin", "wb");
    if (f) { fwrite(&c_out, sizeof(Conta), 1, f); fclose(f); }

    Conta c_in;
    f = fopen("conta.bin", "rb");
    if (f) {
        fread(&c_in, sizeof(Conta), 1, f);
        fclose(f);
        printf("Conta lida: ID=%d | Saldo=R$ %.2f\n", c_in.id, c_in.saldo);
    }
    return 0;
}

⚡ Nível 3: Integração

Problema 18.3 — Acesso Aleatório com fseek(), ftell() e rewind()

Contexto: Acesso Aleatório com fseek(), ftell() e rewind() no contexto de Manipulação de Arquivos, Streams e Persistência Binária.

Requisitos de Execução:

  1. Descobrir o tamanho total de um arquivo posicionando o cursor no final com fseek(f, 0, SEEK_END).

Resultado Esperado

Tamanho do arquivo medido em bytes com precisão.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_3_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Manipulação de Arquivos, Streams e Persistência Binária
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

int main(void) {
    FILE *f = fopen("dados.dat", "w");
    if (f) { fputs("1234567890", f); fclose(f); }

    f = fopen("dados.dat", "rb");
    if (f) {
        fseek(f, 0, SEEK_END);
        long tamanho = ftell(f);
        fclose(f);
        printf("Tamanho exato do arquivo: %ld bytes\n", tamanho);
    }
    return 0;
}

🏆 Nível 4: Desafio Corporativo

Problema 18.4 — Escrita Transacional Atômica com Arquivo Temporário e rename()

Contexto: Escrita Transacional Atômica com Arquivo Temporário e rename() no contexto de Manipulação de Arquivos, Streams e Persistência Binária.

Requisitos de Execução:

  1. Gravar dados em arquivo temporário .tmp e executar rename() atômico para prevenir corrupção em caso de queda de energia.

Resultado Esperado

Persistência atômica garantida sem risco de arquivos corrompidos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_18_4_SeuNome
  2. Envie na tarefa: Atividade Cap 18 - Manipulação de Arquivos, Streams e Persistência Binária
🔑 Gabarito de Código & Solução Comentada
#include <stdio.h>

int main(void) {
    FILE *f = fopen("banco.tmp", "w");
    if (!f) return 1;
    fputs("DADOS CRITICOS ATUALIZADOS", f);
    fflush(f);
    fclose(f);

    // Substituição atômica no sistema de arquivos
    if (rename("banco.tmp", "banco.dat") == 0) {
        puts("Transacao persistida atomicamente com sucesso.");
    }
    return 0;
}