Rechercher : dans
Par :

Langage C : retour à la ligne non voulu

Dernière réponse le 28 jun 2009 à 13:45:28 Arnaud, le 23 jun 2009 à 06:53:00 
 Signaler ce message aux modérateurs

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
Configuration: Linux
Firefox 3.0.11

Meilleures réponses pour « Langage C : retour à la ligne non voulu » dans :
Langage C - Les types de données Voir Les types de données Les données manipulées en langage C sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître l'occupation mémoire (le...
[Langage C] C/C++ Erreur de segmentation VoirQu'est ce qu'une erreur de segmentation Vous êtes en train de développer une application sous Linux en C/C++. Tout va bien, ça compile, les oiseaux chantent. Donc vous lancez votre application pour la tester. Et vous obtenez l'un de ces deux...
Langage C++ - Les types de données VoirLes types de données Les données manipulées en langage C++, comme en langage C, sont typées, c'est-à-dire que pour chaque donnée que l'on utilise (dans les variables par exemple) il faut préciser le type de donnée, ce qui permet de connaître...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Langage C - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage C sont typées, c'est-à-dire que les données contenues dans...

1

framétaux, le 28 jun 2009 à 11:53:49

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 ?

Répondre à framétaux

2

fiddy, le 28 jun 2009 à 13:42:16

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
Google is your friend

Répondre à fiddy

3

 fiddy, le 28 jun 2009 à 13:45:28

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
Google is your friend

Répondre à fiddy