Comment tracer des données en C

Jinku Hu 12 octobre 2023
  1. Utilisez la fonction gnuplot pour vérifier l’indicateur de fin de fichier sur le flux de fichiers
  2. Utilisez la fonction popen pour diffuser les données de tracé vers le processus gnuplot
Comment tracer des données en C

Cet article explique plusieurs méthodes pour tracer des données en C.

Utilisez la fonction gnuplot pour vérifier l’indicateur de fin de fichier sur le flux de fichiers

gnuplot est un puissant programme de traçage qui peut être utilisé pour afficher des graphiques et les enregistrer sous forme de fichiers. Il est généralement utilisé avec des ensembles de données de fichiers au format simple basé sur des colonnes où chaque colonne est délimitée par un seul espace, comme indiqué ci-dessous. Dans cet exemple, nous utilisons la fonction popen pour diffuser les commandes vers le programme gnuplot et tracer les données qui sont stockées dans un fichier séparé. La documentation de gnuplot peut être lue sur cette page. Dans ce cas, nous n’utiliserons que les commandes les plus simples pour démontrer l’utilisation.

La commande plot est la partie principale qui prend différents arguments et paramètres pour traiter et rendre le tracé. Nous fournissons un fichier avec 2 colonnes de nombres qui doivent être tracés sous forme de graphique linéaire. La commande a le format suivant plot 'input.txt' t 'Price' w lp, qui est construit en utilisant fprintf et écrit dans le pointeur de flux de fichier renvoyé par l’appel popen. Le spécificateur t dans la commande est un raccourci du titre et w - with le mot-clé qui indique le style du graphique. Dans ce cas, le style lp (line points) est choisi pour représenter plusieurs points de prix sur une période spécifique. Notez que nous fflush explicitement le flux pour nous assurer que les données sont livrées au programme gnuplot et enfin mettre le programme en pause avec la fonction getchar pour nous assurer que le tracé est affiché jusqu’à ce que l’utilisateur le ferme.

#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);
}

Format de fichier d’entrée:

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

Utilisez la fonction popen pour diffuser les données de tracé vers le processus gnuplot

Alternativement, nous pouvons diffuser les données précédemment stockées dans un fichier séparé directement à partir de la mémoire du programme. La fonction popen est à nouveau utilisée pour ouvrir une communication pipe vers le programme gnuplot puis envoyer les nombres stockés dans des tableaux avec un formatage spécial. Dans cet exemple, la commande a le format - plot - u 1: 2 t Price w lp, suivie par les éléments de données et finalement terminée par le caractère e. Chaque entier doit être séparé par un espace et transmis avec un format similaire à celui du fichier d’entrée de l’exemple précédent. Ainsi, nous utilisons la fonction fprintf pour écrire du texte formaté dans le tube stream gnuplot. Notez que les flux de fichiers ouverts avec l’appel popen doivent être fermés avec la fonction 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);
}
Auteur: 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