Comment tracer des données en C
-
Utilisez la fonction
gnuplot
pour vérifier l’indicateur de fin de fichier sur le flux de fichiers -
Utilisez la fonction
popen
pour diffuser les données de tracé vers le processusgnuplot
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);
}
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