Langage C : retour à la ligne non voulu
Arnaud
-
fiddy Messages postés 11653 Statut Contributeur -
fiddy Messages postés 11653 Statut Contributeur -
Bonjour,
Actuellement je suis en train de faire 1 petit programme pour récupérer les données d'un fichier .CSV qui se présente comme ceci :
11:07:06;43800;5.9;12.7;47.1
11:07:07;36200;8.2;26.6;46.5
11:07:08;37100;18.8;9.5;45.8
11:07:09;38100;25.5;6.9;46.3
11:07:10;37300;22.5;1.5;46.8
11:07:11;38600;29;5.4;46.5
11:07:12;45000;32.6;6.9;46.4
Ce sont des données de mesures de différents appareils pour les 4 dernières colonnes, la 1ère étant l'horloge.
Et mon problème vient de cette horloge car voilà le code qui va avec :
Et voici ce que je vois dans le terminal :
time : 11 : 5 : 7
line :17800.0,-10.4,53.5,50.4
time : 11 : 5 : 0
line :0.0,0.0,0.0,0.0
time : 8 : 0 : 0
line :18100.0,-5.2,60.3,50.8
time : 11 : 5 : 0
line :0.0,0.0,0.0,0.0
time : 9 : 0 : 0
line :18400.0,-4.3,56.8,51.1
time : 11 : 5 : 10
line :19200.0,-0.7,61.6,51.1
time : 11 : 5 : 11
line :20100.0,2.0,58.3,51.2
time : 11 : 5 : 12
line :20600.0,-2.8,57.2,51.2
time : 11 : 5 : 13
line :27700.0,-2.4,61.9,51.1
time : 11 : 5 : 14
line :40600.0,-9.9,41.8,51.2
Et le soucis est que pour les valeurs "08" et "09" que ce soit en heure, minute ou seconde, le programme va à la ligne tout seul et je ne comprends pas d'où cela peut venir
Si vous avez des idées merci beaucoup
Arnaud
Actuellement je suis en train de faire 1 petit programme pour récupérer les données d'un fichier .CSV qui se présente comme ceci :
11:07:06;43800;5.9;12.7;47.1
11:07:07;36200;8.2;26.6;46.5
11:07:08;37100;18.8;9.5;45.8
11:07:09;38100;25.5;6.9;46.3
11:07:10;37300;22.5;1.5;46.8
11:07:11;38600;29;5.4;46.5
11:07:12;45000;32.6;6.9;46.4
Ce sont des données de mesures de différents appareils pour les 4 dernières colonnes, la 1ère étant l'horloge.
Et mon problème vient de cette horloge car voilà le code qui va avec :
i=1;
while(!feof(vf1))
{
fscanf(vf1,"%i:%i:%i",&time[i][1],&time[i][2],&time[i][3]);
fscanf(vf1,";%f;%f;%f;%f\n",&particle[i],&positive[i],&negative[i],&AE[i]);
printf("time : %i : %i : %i \n",time[i][1],time[i][2],time[i][3]);
printf("line : %.1f,%.1f,%.1f,%.1f\n",particle[i],positive[i],negative[i],AE[i]);
Et voici ce que je vois dans le terminal :
time : 11 : 5 : 7
line :17800.0,-10.4,53.5,50.4
time : 11 : 5 : 0
line :0.0,0.0,0.0,0.0
time : 8 : 0 : 0
line :18100.0,-5.2,60.3,50.8
time : 11 : 5 : 0
line :0.0,0.0,0.0,0.0
time : 9 : 0 : 0
line :18400.0,-4.3,56.8,51.1
time : 11 : 5 : 10
line :19200.0,-0.7,61.6,51.1
time : 11 : 5 : 11
line :20100.0,2.0,58.3,51.2
time : 11 : 5 : 12
line :20600.0,-2.8,57.2,51.2
time : 11 : 5 : 13
line :27700.0,-2.4,61.9,51.1
time : 11 : 5 : 14
line :40600.0,-9.9,41.8,51.2
Et le soucis est que pour les valeurs "08" et "09" que ce soit en heure, minute ou seconde, le programme va à la ligne tout seul et je ne comprends pas d'où cela peut venir
Si vous avez des idées merci beaucoup
Arnaud
A voir également:
- C retour a la ligne
- Langage ascii - Guide
- Langage binaire - Guide
- Langage visual basic - Télécharger - Langages
- Pascal langage - Télécharger - Édition & Programmation
- Langage basic gratuit - Télécharger - Édition & Programmation
2 réponses
Bonjour,
Un peu tard peut être. N'y aurait-il pas un schmilblic avec la chaîne de formatage utilisée dans fscanf (fscanf(vf1,"%i:%i:%i",&time[i][1] ...) ? Les données reçues du fichier csv sont en caractères et le flag %i fait la conversion en entier (sauf erreur). Si c'est le cas, le caractère 9 devient une tabulation (ce qui n'est pas un retour chariot, je suis d'accord). Si c'est pour simplement afficher les données, pourquoi ne pas tout traiter sous forme de chaîne de caractères ?
Un peu tard peut être. N'y aurait-il pas un schmilblic avec la chaîne de formatage utilisée dans fscanf (fscanf(vf1,"%i:%i:%i",&time[i][1] ...) ? Les données reçues du fichier csv sont en caractères et le flag %i fait la conversion en entier (sauf erreur). Si c'est le cas, le caractère 9 devient une tabulation (ce qui n'est pas un retour chariot, je suis d'accord). Si c'est pour simplement afficher les données, pourquoi ne pas tout traiter sous forme de chaîne de caractères ?
Salut,
Pourrais-tu donner un peu plus de ton code comme la déclaration des variables. Le top serait d'avoir le main qui va avec.
Et peux-tu ré-expliquer ton problème des 8 et 9, car je ne vois pas ce qui ne va pas avec ta trace d'exécution (hormis le fait qu'il n'y a pas correspondance avec les valeurs lues dans le CSV).
Sinon déjà en conseil, enlève le '\n' de tes fscanf.
Voici un code fonctionnel :
Cdlt
Pourrais-tu donner un peu plus de ton code comme la déclaration des variables. Le top serait d'avoir le main qui va avec.
Et peux-tu ré-expliquer ton problème des 8 et 9, car je ne vois pas ce qui ne va pas avec ta trace d'exécution (hormis le fait qu'il n'y a pas correspondance avec les valeurs lues dans le CSV).
Sinon déjà en conseil, enlève le '\n' de tes fscanf.
Voici un code fonctionnel :
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp=fopen("a.tmp","r");
if(fp==NULL) {
fputs("erreur ouverture fichier\n",stderr);
return EXIT_FAILURE;
}else {
int time[15][3];
double particle[15],positive[15],negative[15],AE[15];
int i=0;
while(!feof(fp)) {
if(fscanf(fp,"%d:%d:%d;%lf;%lf;%lf;%lf",
&time[i][1],&time[i][2],&time[i][3],particle+i,
positive+i,negative+i,AE+i)==7) {
printf("time : %d : %d : %d\n",time[i][1],time[i][2],time[i][3]);
printf("line : %.1f,%.1f,%.1f,%.1f\n",particle[i],positive[i],negative[i],AE[i]);
i++;
}
}
fclose(fp),fp=NULL;
}
return 0;
}
Cdlt
Ben c'est une erreur ^^.
Le caractère sera bien représenté en nombre avec %i, il n'y a pas de souci à ce niveau.
Cdlt