💻 Exemplos de Código: Cap 18 - Manipulação de Arquivos e Streams
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(®istroEncontrado, 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;
}