IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Recherche un gourou du C ;-)


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Recherche un gourou du C ;-)
    Bonjour,

    J'ai un problème un peu compliqué a résoudre, ca fait quelques semaines que je suis dessus.

    Voilà, j'ai dans les eaux de 1000 fichiers .csv dans un repertoire qu'il faut que je charge en mémoire pour pouvoir faire des traitements dessus.

    Les données sont conservees dans chaque fichier sous la forme
    char[10] char[10] int float float float float
    char[10] char[10] int float float float float
    char[10] char[10] int float float float float, etc.

    La solution que j'ai trouvé était de créer une structure pour pouvoir faire des traitements dessus. Mais j'ai beaucoup de problèmes pour arriver à effectuer des traitements dessus depuis une fonction. Voici un bout de code. Il ne résoud que très partiellement le problème :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    #include <stdio.h>
     
    struct entree {
     
    char date[10], time[10];
    int v;
    float a,b,c,d;
     
    }
     
    main () {
     
    struct entree data[1000] ; # 1000 lignes pour le fichier
     
    int i=0;
    FILE *fp;
    fp = fopen("1.csv", "r");
     
    while(!(feof(fp))) {
     
      fscanf(fp, "%s %s %d %f %f %f %f", &date, &time, &v, &a, &b, &c, &d);
     
      strcpy(data[i].date, date);
      strcpy(data[i].time, time);
      data[i].v = v);
      data[i].a = a);
      data[i].b = b);
     
      i++;
    }
     
    }
    J'ai 3 problèmes :
    - j'arrive pas à creer une fonction distincte de main, qui mette les données dans la structure
    - je sais pas comment gérer plusieurs fichiers
    - je sais pas comment gérer un fichier de x lignes (x étant susceptible d'être supérieur à 200.000).

    Je sais, ca fait beaucoup de mémoire vive qu'il va falloir acheter, mais c'est pas un problème ;-)

  2. #2
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Salut,

    Pour l'instant c'est pas un gourou qu'il faudrais pour resoudre ton probleme mais un voyant par ce que je ne voie pas ou est le probleme.
    Mais j'ai beaucoup de problèmes pour arriver à effectuer des traitements dessus depuis une fonction.
    Quel type de traitement doit tu faire?
    Que doit tu optimiser : le temps CPU, la ram ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void fonction(void)
    {
    }
    int main (int argc, char *argv[])
    {
      fonction();
      return 0;
    }

  3. #3
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par zedis
    Voilà, j'ai dans les eaux de 1000 fichiers .csv dans un repertoire qu'il faut que je charge en mémoire pour pouvoir faire des traitements dessus.
    - je sais pas comment gérer plusieurs fichiers
    - je sais pas comment gérer un fichier de x lignes (x étant susceptible d'être supérieur à 200.000).

    Je sais, ca fait beaucoup de mémoire vive qu'il va falloir acheter, mais c'est pas un problème ;-)
    Quels genres de traitement veux tu faire ? peut etre que les bases de donnees seraient plus appropriees pour ton probleme.

    Citation Envoyé par zedis
    - j'arrive pas à creer une fonction distincte de main, qui mette les données dans la structure
    utilise un pointeur sur ta structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct entree {
    char date[10], time[10];
    int v;
    float a,b,c,d;
    }*PENTREE;
     
    void ajout_donnees(PENTREE donnees)
    {
    donnees->v = v;
    }

  4. #4
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    coucou,

    1°) Est ce que les traitements se font de manière indépendante sur chaque fichier ou non ?
    2°) Est ce que pour un fichier tu ne pourrais pas segmenter les traitements ?
    3°) Je pense comme semaj_james qu'une BDD serait plus pertinente si pcela est possible !

    - j'arrive pas à creer une fonction distincte de main, qui mette les données dans la structure
    Voir ce qu'a dit semaj_james sauf que j'éviterais le typedef sur un pointeur (avis perso !)

    - je sais pas comment gérer plusieurs fichiers
    utilise un tableau de pointeur sur fichiers (FILE *).

    voila

    P.S : oublie pas le fclose à la fin du traitement du fichier (!= du traitement de la structure !!!)
    Hiko-seijuro

    n'cha - hoyoyo gang

    espace perso : http://hiko-seijuro.developpez.com
    dernier tuto : Introduction à l'éditeur de texte Emacs sous linux
    consulter les faqs : http://www.developpez.com/faq
    PAS DE QUESTIONS TECHNIQUES PAR MP OU MAIL

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Salut,

    Citation Envoyé par zedis
    Les données sont conservees dans chaque fichier sous la forme
    char[10] char[10] int float float float float
    char[10] char[10] int float float float float
    char[10] char[10] int float float float float, etc.
    Ton fichier est au format CSV (Comma separated value). Je suppose qu'on a donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char[10],char[10],int float,float,float,float\n
    char[10],char[10],int,float,float,float,float\n
    etc.
    Voici quelques remarques sur ton code:
    • La norme n'autorise que deux formes pour la fonction main qui doit impérativement retourner un entier de type int sous peine de comportement indéfinit. Voici les deux formes:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      int main(void)
      {
          /*...*/
          return 0;
      }
      ou
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      int main(int argc, char *argv[])
      {
          /*...*/
          return 0;
      }
    • # n'est pas une marque de commentaire valide en C. Utilise soit /*...*/ ou // si tu programmes en C99.
    • Les variables date, time, v, a, b, c, d que tu utilises en argument de fscanf ne sont pas définies
    • Lorsque tu ouvres un fichier avec fopen, il faut le refermer avec fclose


    A part cela, la stratégie adéquate pour lire un fichier au format CSV est de:
    1. Lire chaque ligne du fichier avec la fonction fgets et stocker la ligne courrante dans un tampon.
    2. Analyser la ligne stockée dans le tampon avec une fonction dont le prototype pourrait être:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
       
      /**
       * Analyse et valide une ligne du fichier
       *
       * IN: p_tmp - pointeur sur le tableau de caractère contenant la ligne 
       *                 courante chargée en mémoire.
       * OUT: p_data - pointe sur un objet de type struct entree en mémoire.
       *                        initialise cette structure avec les données de p_tmp.
       * RETURN: code d'erreur
       */
      int analyse_ligne(char const *p_tmp, struct entree *p_data);


    Pour ouvrir les différents fichiers 1.csv, 2.csv, etc., tu peux utiliser la fonction sprintf.

    Bonne chance

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Citation Envoyé par semaj_james
    nteur sur ta structure:
    De toute façon il n'est pas conseillé de passer une structure en paramètres, il est conseillé de passer un pointeur sur une structure.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  7. #7
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    Citation Envoyé par hiko-seijuro
    Voir ce qu'a dit semaj_james sauf que j'éviterais le typedef sur un pointeur (avis perso !)
    Citation Envoyé par Skyrunner
    De toute façon il n'est pas conseillé de passer une structure en paramètres, il est conseillé de passer un pointeur sur une structure.
    Pourriez vous m'expliquer pourquoi ?

  8. #8
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par semaj_james
    Pourriez vous m'expliquer pourquoi ?
    En C le passage de paramètre à une fonction se fait par recopie. Imagine que ta structure, que tu souhaites passer en paramètre, contienne une très grosse quantité d'éléments. A chaque appel de la fonction en question, toute ta structure sera recopiée dans la pile. Ce qui peut poser problème au niveau de la perfo.
    C'est pour cela qu'il est préférable de passer un pointeur plutot que la structure.

    A+
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  9. #9
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    ok je comprends mieux. je te remercie.
    Et au sujet du typdef sur un pointeur ?

  10. #10
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par semaj_james
    Et au sujet du typdef sur un pointeur ?
    Eh bien, c'est juste pour une question de lisibilité. Le fait de faire un typedef sur un pointeur, cela a pour conséquence de masquer le pointeur dans la suite du code. Je ne sais pas si je suis très claire...........
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  11. #11
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le problème est que beaucoup font des typedefs de pointeurs qui "cachent" leur nature de pointeur.

    Si je te montre une fonction déclarée ainsi:
    Le type arbre est-il un pointeur, un entier ou une structure ?

    Évidemment, quand le type représente explicitement un pointeur (comme PENTREE), il n'y a pas trop de problème...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par crocodilex
    Je ne sais pas si je suis très claire...........
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Membre habitué Avatar de semaj_james
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 193
    Points : 139
    Points
    139
    Par défaut
    ok pour le typdef. je vous remercie

  14. #14
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Peut-etre que je suis une fille.....Je n'ai mentionné nulle part mon sexe....
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  15. #15
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par crocodilex
    En C le passage de paramètre à une fonction se fait par recopie. Imagine que ta structure, que tu souhaites passer en paramètre, contienne une très grosse quantité d'éléments. A chaque appel de la fonction en question, toute ta structure sera recopiée dans la pile. Ce qui peut poser problème au niveau de la perfo.
    C'est pour cela qu'il est préférable de passer un pointeur plutot que la structure.

    A+
    Et puis, la recopie d'une structure dont certains champs sont des pointeurs peut entraîner des surprises...

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

Discussions similaires

  1. [XL-2003] Recherche "Gourou" XL
    Par raoullt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 11/10/2012, 20h12
  2. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  3. [PRO*C] Recherche information
    Par Anonymous dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 04/04/2002, 17h53
  4. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo