Carregando
0x130Lição 20 de 20

Projeto final: um relatório de log de sensores

Construa uma pequena ferramenta de streaming que valida as leituras e relata estatísticas úteis.

30 min Questionário com 4 perguntas 1 exercício de código
Ao final desta lição, você saberá
  • 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 XP

Manter ou rejeitar?

Classifique as linhas de log que chegam antes de escrever o parser. O que o relatório deve contar?

0 de 5 classificadosPontuação 0/0
  • “roomA 21.5”

  • “roomB 201”

  • “roomC hot”

  • “roomD -100”

  • “roomE 20 extra”

report-shape.c
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.

Exercício 1

Construa o relatório em streaming

+25 XP

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
main.c
Carregando editor…

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…