Langage C : retour à la ligne non voulu

Fermé
Arnaud - 23 juin 2009 à 06:53
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 28 juin 2009 à 13:45
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 :
     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:

2 réponses

Utilisateur anonyme
28 juin 2009 à 11:53
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 ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
28 juin 2009 à 13:42
Les données reçues du fichier csv sont en caractères et le flag %i fait la conversion en entier (sauf erreur).
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
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
28 juin 2009 à 13:45
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 :
#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
0