Projeto final: um relatório de log de sensores
Construa uma pequena ferramenta de streaming que valida as leituras e relata estatísticas úteis.
- Ler um fluxo uma linha limitada de cada vez
- Rejeitar registros malformados e fora do intervalo
- Agregar os valores válidos num relatório útil
Uma equipe de manutenção predial coleta leituras de temperatura de muitos sensores. O job noturno dela precisa de um relatório rápido, mesmo quando algumas linhas do log estão corrompidas. Esse é um formato realista de trabalho em C: ler um fluxo, validar cada registro, manter só o estado necessário e mandar um resumo para a próxima ferramenta do pipeline. O exemplo é pequeno; o método também aparece em agentes de telemetria, conversores de arquivos e utilitários de linha de comando.
Planeje antes de digitar
Cada linha é sensor-id temperature, como roomA 21.5. Aceite temperaturas de -100 a 200, inclusive. Para cada linha válida, atualize a contagem, o total, o mínimo e o máximo. Conte as linhas inválidas separadamente. Quando não houver leituras válidas, evite dividir por zero. Um char line[128] fixo deixa o limite da entrada visível; ferramentas de produção também devem decidir como tratar linhas maiores que o buffer.
Experimente
Até 15 XPManter ou rejeitar?
Classifique as linhas de log que chegam antes de escrever o parser. O que o relatório deve contar?
“roomA 21.5”
“roomB 201”
“roomC hot”
“roomD -100”
“roomE 20 extra”
1#include <math.h>
2#include <stdio.h>
3
4int main(void) {
5 char line[128];
6 while (fgets(line, sizeof line, stdin) != NULL) {
7 char name[16], extra;
8 double temperature;
9 if (sscanf(line, "%15s %lf %c", name, &temperature, &extra) != 2 ||
10 !isfinite(temperature) || temperature < -100 || temperature > 200) {
11 /* Count the invalid line and continue. */
12 continue;
13 }
14 /* Update count, total, minimum and maximum. */
15 }
16 return 0;
17}Use fgets para ler uma linha limitada e depois sscanf com uma largura no nome e uma conversão extra para pegar texto que não seja espaço em branco no final. O isfinite rejeita NaN e infinito. Este exercício espera linhas de log curtas; num parser de produção, detecte e descarte as linhas longas demais antes de processar o próximo registro. Compile localmente com gcc -std=c17 -Wall -Wextra -Wpedantic -g -fsanitize=address,undefined report.c -lm enquanto testa. Os guias do AddressSanitizer do Clang e do UndefinedBehaviorSanitizer explicam o que essas ferramentas pegam.
Principais conclusões
Limite a entrada, valide cada registro e carregue só o estado necessário.
Trate um conjunto válido vazio como um caso real.
Use avisos, sanitizers e entradas malformadas antes de confiar numa ferramenta de linha de comando.
Quiz da aula
4 perguntas · aprovação com 3 acertos · até 50 XP
Ao passar, você conclui a aula e mantém sua sequência. As perguntas erradas voltarão em sessões de revisão.
Pratique: escreva código em C
Estes exercícios rodam de verdade. Escreva o programa, clique em “Executar testes” e leia o que o compilador informa: aprender a ler as mensagens do compilador é metade do aprendizado de C.
Construa o relatório em streaming
Leia linhas de sensor-id temperature do stdin. Aceite temperaturas de -100 a 200, inclusive. Rejeite linhas malformadas e texto extra no final. Imprima samples=N average=X.X min=X.X max=X.X invalid=M. Se não houver amostras válidas, imprima samples=0 invalid=M. Mantenha o parser limitado e use isfinite.
- Log misturado
- Nenhum registro válido
- Limite e texto extra no final
Seu código é compilado com gcc 14 (-Wall -Wextra) e executado no Compiler Explorer (godbolt.org), um serviço público gratuito.
Dúvidas sobre esta lição
Travou em algum ponto? Pergunte. Descobriu algo? Compartilhe. Explicar também é uma ótima forma de aprender.
Carregando publicações…