Come tracciare i dati in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione gnuplot per controllare l’indicatore di fine file sul flusso di file
  2. Usa la funzione popen per trasmettere i dati del grafico al processo gnuplot
Come tracciare i dati in C

Questo articolo spiegherà diversi metodi su come tracciare i dati in C.

Usa la funzione gnuplot per controllare l’indicatore di fine file sul flusso di file

gnuplot è un potente programma di plottaggio che può essere utilizzato per visualizzare i grafici e salvarli come file. Viene generalmente utilizzato con set di dati di file con il semplice formato basato su colonne in cui ogni colonna è delimitata da un singolo spazio, come mostrato di seguito. In questo esempio, usiamo la funzione popen per trasmettere i comandi al programma gnuplot e tracciare i dati memorizzati in un file separato. La documentazione di gnuplot può essere letta su questa pagina. In questo caso, utilizzeremo solo i comandi più semplici per dimostrare l’utilizzo.

Il comando plot è la parte centrale che richiede diversi argomenti e parametri per elaborare e rendere il grafico. Forniamo un file con 2 colonne di numeri che devono essere tracciate come grafico a linee. Il comando ha il seguente formato plot 'input.txt' t 'Price' w lp, che è costruito usando fprintf e scritto nel puntatore del flusso di file restituito dalla chiamata popen. L’identificatore t nel comando è l’abbreviazione del titolo e della parola chiave w - with che indica lo stile del grafico. In questo caso, lo stile lp (punti linea) viene scelto per rappresentare più punti di prezzo in un periodo specifico. Si noti che abbiamo esplicitamente fflush il flusso per assicurarci che i dati siano consegnati al programma gnuplot e infine mettiamo in pausa il programma con la funzione getchar per assicurarci che il grafico sia visualizzato fino a quando l’utente non lo chiude.

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

int main(void) {
  const char *filename = "input.txt";

  FILE *gnuplot = popen("gnuplot", "w");
  if (!gnuplot) {
    perror("popen");
    exit(EXIT_FAILURE);
  }

  fprintf(gnuplot, "plot \"%s\" t 'Price' w lp\n", filename);
  fflush(gnuplot);
  fprintf(stdout, "Click Ctrl+d to quit...\n");
  getchar();

  pclose(gnuplot);
  exit(EXIT_SUCCESS);
}

Formato file di input:

2005 49
2006 52
...
2019 154
2020 127
2021 147

Usa la funzione popen per trasmettere i dati del grafico al processo gnuplot

In alternativa, possiamo trasmettere i dati precedentemente memorizzati in un file separato direttamente dalla memoria del programma. La funzione popen viene utilizzata di nuovo per aprire una comunicazione pipe al programma gnuplot e quindi inviare i numeri memorizzati in array con una formattazione speciale. In questo esempio, il comando ha il formato - plot '-' u 1:2 t 'Price' w lp, seguito dagli elementi dati e infine terminato con il carattere e. Ogni numero intero deve essere separato da uno spazio e passato con un formato simile al file di input dell’esempio precedente. Quindi, utilizziamo la funzione fprintf per scrivere testo formattato nel flusso pipe gnuplot. Nota che, i flussi di file aperti con la chiamata popen dovrebbero essere chiusi con la funzione pclose.

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

int main(void) {
  int x[] = {2015, 2016, 2017, 2018, 2019, 2020};
  int y[] = {344, 543, 433, 232, 212, 343};

  FILE *gnuplot = popen("gnuplot", "w");
  if (!gnuplot) {
    perror("popen");
    exit(EXIT_FAILURE);
  }

  fprintf(gnuplot, "plot '-' u 1:2 t 'Price' w lp\n");
  for (int i = 0; i < 6; ++i) {
    fprintf(gnuplot, "%d %d\n", x[i], y[i]);
  }
  fprintf(gnuplot, "e\n");
  fprintf(stdout, "Click Ctrl+d to quit...\n");
  fflush(gnuplot);
  getchar();

  pclose(gnuplot);
  exit(EXIT_SUCCESS);
}
Autore: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook