Código executável completo demonstrando persistência de arquivos texto com fgets/fprintf, serialização binária com fwrite/fread e busca direta posicional com fseek.


📄 Exemplo 1: Processador de Arquivo de Texto / Logs (log_texto.c)

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *nomeArquivo = "telemetria.log";

    printf("====================================================\n");
    printf(" 📄 ESCRITA E LEITURA DE ARQUIVO TEXTO EM C\n");
    printf("====================================================\n");

    // 1. Escrita no Arquivo Texto
    FILE *fEscrita = fopen(nomeArquivo, "w");
    if (fEscrita == NULL) {
        perror("[ERRO]: Falha ao criar arquivo de log");
        return EXIT_FAILURE;
    }

    fprintf(fEscrita, "LOG_EVENTO=INICIALIZACAO_SISTEMA | CODIGO=200\n");
    fprintf(fEscrita, "LOG_EVENTO=CALIBRACAO_SENSORES   | CODIGO=201\n");
    fprintf(fEscrita, "LOG_EVENTO=OPERACAO_NORMAL       | CODIGO=202\n");
    fclose(fEscrita);
    printf(">> 3 registros de log gravados com sucesso.\n\n");

    // 2. Leitura Segura Linha por Linha com fgets
    FILE *fLeitura = fopen(nomeArquivo, "r");
    if (fLeitura == NULL) {
        perror("[ERRO]: Falha ao ler arquivo de log");
        return EXIT_FAILURE;
    }

    char bufferLinha[128];
    int numeroLinha = 1;

    printf("--- Conteudo Lido do Disco ---\n");
    while (fgets(bufferLinha, sizeof(bufferLinha), fLeitura) != NULL) {
        printf(" Linha #%d: %s", numeroLinha++, bufferLinha);
    }

    fclose(fLeitura);
    fLeitura = NULL;
    printf("====================================================\n");

    return EXIT_SUCCESS;
}

📄 Exemplo 2: Micro Banco de Dados Binário com fseek (db_binario.c)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

typedef struct {
    uint32_t id;
    char modelo[24];
    double temperatura;
} RegistroDispositivo;

int main(void) {
    const char *nomeDb = "dispositivos.dat";

    // 1. Gravação Binária de 3 Registros Contíguos
    RegistroDispositivo dispositivos[3] = {
        {101, "Sensor_Alpha", 24.5},
        {102, "Sensor_Beta",  31.8},
        {103, "Sensor_Gamma", 19.2}
    };

    FILE *fDb = fopen(nomeDb, "wb");
    if (fDb == NULL) return EXIT_FAILURE;

    fwrite(dispositivos, sizeof(RegistroDispositivo), 3, fDb);
    fclose(fDb);

    // 2. Acesso Direto (Random Access) ao 2º Registro (Índice 1) sem ler os outros!
    FILE *fBusca = fopen(nomeDb, "rb");
    if (fBusca == NULL) return EXIT_FAILURE;

    size_t indiceDesejado = 1; // Registro Beta
    fseek(fBusca, (long)(indiceDesejado * sizeof(RegistroDispositivo)), SEEK_SET);

    RegistroDispositivo registroEncontrado;
    if (fread(&registroEncontrado, sizeof(RegistroDispositivo), 1, fBusca) == 1) {
        printf("====================================================\n");
        printf(" 💾 BUSCA DIRETA EM BANCO BINARIO (FSEEK O(1))\n");
        printf("====================================================\n");
        printf(" Registro Localizado no Offset %zu bytes:\n", 
               indiceDesejado * sizeof(RegistroDispositivo));
        printf("   ID:          #%u\n", registroEncontrado.id);
        printf("   Modelo:      %s\n", registroEncontrado.modelo);
        printf("   Temperatura: %.2lf C\n", registroEncontrado.temperatura);
        printf("====================================================\n");
    }

    fclose(fBusca);
    return EXIT_SUCCESS;
}