Forum Programmation.c Probleme de lecture fichier

Posté par  .
Étiquettes : aucune
0
18
avr.
2005
Bonjour, je suis tout nouveau ici, de meme que je suis novice en c et étant en stage actuellement je bute sur la prog.

Voilà mon probleme j'ai des fichiers de données dont les 1eres lignes sont du baratin, puis ensuite les donnees:

FORMAT-1

2004-07-15 11:09:15 0

BLS900

1 11 0



file generated by Scintec BLSRUN

Main Data

Scintillation Index Beta # beta # # S # 1

(Cn^2) # (Cn^2) # m^-2/3 # S # 1

Cn^2 corr. # Cn^2 # m^-2/3 # S # 1

(CT^2) # (CT^2) # K^2 m^-2/3 # S # 1

CT^2 corr. # CT^2 # K^2 m^-2/3 # S # 1

Heat Flux (H) # (H) # W m^-2 # S # 1

Heat Flux H corr. # H # W m^-2 # S # 1

Fried Diameter (r0) # (r0) # m # S # 1

Fried Diameter r0 corr. # r0 # m # S # 1

Crosswind # wind # m/s # S # 1

error code 1 # ALIGN LEVEL NUL NUL FLUCT BATT PATH NUL NUL COMM ALG NOSIGNAL WINDCALC WINDRANGE DUMMY # # E # WEIIWWIIIEEEWWE



2004-07-15 00:00:00 00:00:00 00:00:00

0 0 0 0 0 0 0 0 0 0 16384



2004-07-15 18:25:00 18:25:00 00:01:00

0.008 0.03368e-12 0.03368e-12 0.04167 0.04167 46.6 46.6 0.0134 0.0134 0.00 0



2004-07-15 18:26:00 18:26:00 00:01:00

0.009 0.04417e-12 0.04417e-12 0.05464 0.05464 57.1 57.1 0.0114 0.0114 0.00 0

etc etc.....

avec donc la date et en dessous les données séparées par des blancs.

dans un autre type de fichiers qui commence direct par date puis les données sur la meme ligne je récupère avec succes les dates et heures avec

fgets(chaine,200,fichier);
sscanf(chaine,"%d %d-%d-%d %d:%d",&x, &bornes[0],&bornes[1], &bornes[2], &bornes[3], &bornes[4]);
//0 = année 1 = mois 2=jour 3=heure 4=minutes


mais voilà je ne sais pas comment aller lire les dates avec le 1er type de fichiers ..... si vous avez une idée....merci beaucoup d'avance!
  • # Gni ?

    Posté par  . Évalué à 2.

    Je ne vois pas où est le problème.

    Si la différence entre les deux fichiers se résume au fait que la date se trouve ou non sur la première ligne, fais simplement une boucle avec ton fgets() à l'intérieur, teste à chaque tour si la ligne a le format qui te semble correct, et le cas échéant, parse la date.

    Tu devrais aussi jeter un oeil du coté des expression régulières pour ce genre de traitement.
    • [^] # Re: Gni ?

      Posté par  . Évalué à 3.

      > Tu devrais aussi jeter un oeil du coté des expression régulières pour ce genre de traitement.

      Ouais, c'est clairement le genre de parsing lourdingue à faire en perl ou en python ça, ça fait gagner un temps infini.
  • # dans time.h

    Posté par  . Évalué à 2.

    y a pleins de fonctions terribles, comme strptime

    et en plus, joie!, c'est du ANSI :)
    • [^] # Re: dans time.h

      Posté par  . Évalué à 1.

      hello merci des conseils mais en fait j'avais un pb d'ordre de base débile que j'ai réglé, par contre avis aux pros du c et de scilab: g mon prog scilab qui fait appel à des fonctions c dont celle qui lit les fichiers textes, mais comme je me perds avec ces histoires de pointeurs et cie je n'arrive absolument pas à imprimer ce qui est scanné par mon sscanf (pour moi c'est "chaine") comment faire pour sortir cette chaine de ma fonction lecture.c pour l'imprimer dans mon main en scilab.??? j'ai esssayé de faire ds le c un chaine1=*chaine; j'ai déclaré en global chaine1 partout,et chaine est declaré comme suit:char * chaine = malloc(taille); malgré ca scilab me dit :"la chaine lue est : !--error 207
      printf: Argument 2 : wrong type argument, expecting a matrix of strings"

      ca fait 2 jours que j'essaie rrrrrrrrrrrrrrrrrrrrr aidez moi svp!!
      • [^] # Re: dans time.h

        Posté par  . Évalué à 2.

        va falloir que tu postes des petits bouts de code, parce que là ...
        par exemple la ligne avec ton printf
        • [^] # Re: dans time.h

          Posté par  . Évalué à 1.

          ok je vais essayer de mettre ce qui est important:


          main.sce
          ==========================================
          du blabla puis appel de lecture.sce



          function lecture.sce
          ==========================================
          function lecture_sce()
          global resultats;
          global chaine1;





          donnees_lues=call("lecture",chemin,1,"c",type_fichiers,2,"i",variable,3,"i",tab_fichiers(i)(2),4,"i","out",[10,tab_fichiers(i)(2)],5,"r");
          //appel de la fonction lecture.c ici je voudrais juste mettre un printf("voilà la chaine brute lue: %s",chaine1)



          lecture.c
          ===============================================
          #include <string.h>

          #include <stdio.h>

          #include <stdlib.h>
          char chaine1;

          int lecture(char *nom_fichier ,int *type_fichiers,int *variable, int *nb_lignes,float sortie[][10])

          {FILE *fichier;



          double av[30];
          double v1;
          int taille = 300;

          int s0,s1,s2,s3,s4,s5,p;

          char * chaine = malloc(taille);



          fichier=fopen(nom_fichier,"r");



          if (!feof(fichier)){

          i=0;

          fgets(chaine,300,fichier);

          verif=sscanf(chaine," %d %d-%d-%d %d:%d:%d %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf %lf",&x,&s0,&s1,&s2,&s3,&s4,&s5,&av[0],&av[1],&av[2],&av[3],&av[4],&av[5],&av[6],&av[7],&av[8],&av[9],&av[10],&av[11],&av[12],&av[13],&av[14],&av[15],&av[16],&av[17],&av[18],&av[19]);

          //jusque là normalement c assez clair je dois avoir peu importe les affectations une string de 300 dans chaine....maintenant comment renvoyer cette chaine de caracteres à main ou lecture.sce pour pouvoir mettre le printf tout bete....sans ca je ne peux pas vérifier ce que fait fgets et donc je suis bloqué pour programmer......
          • [^] # Re: dans time.h

            Posté par  . Évalué à 1.

            question con: tu peux pas mettre ton printf dans ta fonction lecture directement après le fgets ?

            le problème de ton chaine1, c'est qu'il est défini en char alors qu'il devrait être déclaré en char* dans ton fichier.C. En plus, je suis pas sur que ton chaine1 en C soit le meme que ton chaine1 dans ton .sce mais en même temps je connais pas du tout scilab. Mais alors vraiment pas du tout :)

            sinon, tu peux rajouter un char* dans le prototype de ta fonction lecture
            genre
            int lecture(char *nom_fichier ,int *type_fichiers,int *variable, int *nb_lignes,float sortie[][10], char* chaine_sortie)
            {
            (...)
            fgets(chaine,300,fichier);
            chaine_sortie=chaine;
            }

            pour finir, la lecture de la chaine de date avec strptime est peut-être un peu galère, mais ça serait quand même vachement plus joli :)
            • [^] # Re: dans time.h

              Posté par  . Évalué à 1.

              hello ton idee j'avais déjà testé impossible de faire sortir cette PUTAIN de chaine.......sinon ce que tu appelles prototype c'est la declaration de la fonction? en fait g essayé de faire sortir chaine exactement comme je sors d'autres variables, mais a chaque fois ca merde au niveau du format.....maintenant 3 jours de blocage.....je deviens fou....

              sinon question con: non on ne peut pas scilab ne recupere pas les sorties standard....

              et moi j'en ai une autre qusetion con: comment je fais pour executer une fonction c sans le faire sous scilab??? (oui je suis super débutant, je taffe pour comprendre et modifier tout ce code....mais mes galeres sont en c pas trop en scilab....)
              • [^] # Quelques conseils

                Posté par  . Évalué à 2.

                Je ne sais pas quel genre de projet tu mène en ce moment, mais à mon avis, vouloir maîtriser Scilab et le C en même temps, c'est ce donner beaucoup de mal pour rien. C'est un peu comme vouloir apprendre deux langues étrangères pendant la même heure de cours. Fais d'abord l'un puis l'autre.

                Ensuite, le prototype d'une fonction, c'est effectivement sa déclaration. En principe, définir une fonction (autrement dit, écrire son contenu) la déclare implicitement, donc écrire son prototype ne sert que si tu comptes t'y référer dans ton code, avant de l'avoir défini, ou dans un autre fichier. Ce qui au final couvre 99% des cas. Donc tu mets proprement tes prototypes dans un fichier .h, tu inclues celui-ci au début de ton code et tu ne t'en soucies plus.

                Si tu veux renvoyer chaine à la fonction main, le plus simple est de faire renvoyer le pointeur sur cette chaine par ta fonction :

                char * lecture (...)
                {
                ...
                return chaine;
                }

                Ensuite, tu peux l'invoquer directement dans ton main et dans la fonction qui l'appelle :

                int main ()
                {
                printf ("Le résultat est %s\n",lecture());
                }


                et moi j'en ai une autre qusetion con: comment je fais pour executer une fonction c sans le faire sous scilab


                Ben tu fais un exécutable ! C'est à ça que cela sert ! A écrire des programmes indépendants. La fonction main sert à cela. Elle porte ce nom pour que le système sache que c'est la première chose à exécuter lorsqu'il va lancer ton programme.
                • [^] # Re: Quelques conseils

                  Posté par  . Évalué à 1.

                  hello robin oui je sais c'est tres galere pour moi mais je n'ai pas le choix.....je suis laché dans un programme de 10 pages scilab avec 2 fonctions en c, que je dois completer et modifier bref, j'en chie....bon ta solution ne peux pas fonctionner, je ne peux pas appeler une fonction c comme ca dans mon principal qui est en scilab......
              • [^] # Re: dans time.h

                Posté par  . Évalué à 1.

                "sinon ce que tu appelles prototype c'est la declaration de la fonction?"

                ouais, c'est la même chose à un pouillème près.

                'comment je fais pour executer une fonction c sans le faire sous scilab???'

                Le plus simple, ce serait que tu jettes un oeil sur un tutoriel (demande à google)

                en gros, il faut que tu définisse une fonction main dans .c qui sera le point d'entrée de ton programme. Cette fonction main accepte les paramètres de la ligne de commande (cf argc et argv). Dans cette fonction main, tu peux ensuite appeler ta fonction lecture.

                Il faudra aussi que tu te débrouilles pour compiler ton prog en dehors de scilab. Si t'es sous linux, gcc fera ça très bien pour toi. Sous windows ... scilab doit bien avoir un compilo quelquepart, mais est ce que c'est un compilo embarqué ou un compilo externe ...

                après une petite visite sur le site de scilab, la version win utilise lcc-win32. Si tu es sous win donc, tu dois avoir moyen d'utiliser icc-win directement.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.