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 :

Fonction de lecture de données et appel dans main


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 8
    Par défaut Fonction de lecture de données et appel dans main
    Bonjour

    je cherche à lire trois paramètres (x,y,z) dans un fichier texte qui vont être utilisés par la suite dans main.
    j'ai construit alors une fonction qui permet de lire ces données
    et j'aimerai faire appel dans main à cette fonction et utiliser ainsi les données récupérés à partir du fichier texte:

    voici le code:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    #include <cstdlib> 
    #include <stdio.h> 
     
    using namespace std; 
     
     
    struct Lire_Struct 
    { 
    float x; 
    float y; 
    float z; 
    }; 
     
    void Lire_Donnees (Lire_Struct ); 
     
    int main() 
    { 
     
    Lire_Struct Lire_Ptr; 
    Lire_Donnees (Lire_Ptr); 
     
    system("PAUSE"); 
    return 0; 
    } 
     
     
    void Lire_Donnees (Lire_Struct Lire_Ptr) 
    { 
    FILE* fichier; 
    fichier = fopen("Donnees.txt","rt"); 
    int i=1; 
    char ligne[255]; 
    float var; 
    if (fichier) 
    { 
    while(fgets(ligne,255,fichier)!=NULL) 
    { 
    sscanf(ligne,"%f",&Lire_Ptr.x); 
    fgets(ligne,255,fichier); 
    sscanf(ligne,"%f",&Lire_Ptr.y); 
    fgets(ligne,255,fichier); 
    sscanf(ligne,"%f",&Lire_Ptr.z); 
    } 
    } 
    }
    ce que je cherche c'est de récupérer x, y et z dans main en faisant appel à la fonction Lire_Donnees, le code tel qu'il est écrit ne reconnait pas Lire_Ptr.x, Lire_Ptr.y, Lire_Ptr.z dans main.

    Ps: mon fichier "donnees.txt" contient les données par exemple de la forme suivante :

    20 x
    40 y
    80 z



    Merci bcp d'avance.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    Salut,

    voilà un code qui devrait compiler et faire ce que tu souhaite :
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    #include <cstdlib>
    #include <stdio.h>
     
    using namespace std;
     
     
    struct Lire_Struct
    {
    float x;
    float y;
    float z;
    };
     
    void Lire_Donnees (Lire_Struct * inPtr);
     
    int main()
    {
     
    Lire_Struct Lire_Ptr;
    Lire_Donnees (&Lire_Ptr);
     
    system("PAUSE");
    return 0;
    }
     
     
    void Lire_Donnees (Lire_Struct * inPtr)
    {
    FILE* fichier;
    fichier = fopen("Donnees.txt","rt");
    int i=1;
    char ligne[255];
    if (fichier)
    {
    // là je pige pas tout, si y'a plusieurs triplets à lire alors la procédure n'est
    // pas bonne
    // et si tu veux juste faire un test sur le retour de fgets() alors fait juste un
    // test et pas un while qui peut conduire à une erreur grave...
    /*
    while(fgets(ligne,255,fichier)!=NULL)
    {
    sscanf(ligne,"%f",&(Lire_Ptr->x));
    fgets(ligne,255,fichier);
    sscanf(ligne,"%f",&(Lire_Ptr->y));
    fgets(ligne,255,fichier);
    sscanf(ligne,"%f",&(Lire_Ptr->z));
    }
    */
    if( fgets(ligne,255,fichier)!=NULL) )
    {
    sscanf(ligne,"%f",&(Lire_Ptr->x));
    }
    /* etc... */
    }
    }
    Saches toutefois que ce code est un code C et non pas C++. Ce n'est ni mieux ni pire, mais à mon avis tu peux l'améliorer grandement en supprimant les pointeurs avec le C++...

    Tarrke

  3. #3
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Par défaut
    Bonjour,

    Tu as fait du C avant de passer au C++, j'ai bon ?

    C C++
    FILE* fstream (ifstream,ofstream)
    passage de paramètre par pointeur référence
    char* string
    sscanf & co flux d'entrée/sortie << et >>
    les include <...h> certains sans .h (je pense a stdio.h qui devient cstdio)

    donc voilà les équivalences C/C++. rien d'obligatoire, les fonctions C sont supportées par le C++. juste qu'une fois qu'on sait se servir des outils C++, ça peut simplifier les choses.

    Tarrke a raison. tu as passé ta structure par valeur, il faut que tu procèdes autrement si tu veux que ta fonction de lecture initialise effectivement la variable du main. la solution pointeur est correcte, mais on privilégie les références en C++ dès qu'on peut.

    Pour le reste du code, c'est très C. donc je ne sais pas si tu veux être orienté vers du code C++, ou si tu préfères garder au maximum ton code (auquel cas je conseillerais le forum C).

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Par défaut
    Merci bigboomshakala pour ces précisions.

    En effet le code que j'ai fournit est un code en C pour coller au maximum au code proposé au début.

    Petite question toutefois, comme tu le dit en C++ on utilise les références lorsque l'on le peut, dans ce cas précis, sans changer rien d'autre, peut-on utiliser une référence sur la structure pour passer l'argument ?

    Tarrke

  5. #5
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Tout à fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void main()
    {
       Lire_Struct Lire_Ptr;
       Lire_Donnees (Lire_Ptr); 
    }
     
    // prend en parametre une référence sur un Lire_Struct
    void Lire_Donnees (Lire_Struct& Lire_Ptr)
    {
       ...
       sscanf(ligne,"%f", &Lire_Ptr.x);
    }
    Et ta variable sera passée par référence -> ce n'est pas une copie qui est passée, et tes modifications sont toujours présentes une fois l'appel de la fonction terminé.

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En C++ il vaudra mieux faire ceci :

    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
    #include <iostream>
    #include <fstream>
     
    struct Lire_Struct
    {
        float x;
        float y;
        float z;
    };
     
    std::istream& operator >>(std::istream& is, Lire_Struct& ls)
    {
        return is >> ls.x >> ls.y >> ls.z;
    }
     
    int main()
    {
        std::ifstream File("toto.txt");
        Lire_Struct ls;
     
        if (File)
            File >> ls;
        else
            Erreur...
     
        return 0;
    }

Discussions similaires

  1. Réponses: 7
    Dernier message: 30/05/2006, 11h09
  2. [MySQL] lecture de données binaires dans une BDD
    Par Sion_Sempai dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/03/2006, 12h18
  3. Réponses: 6
    Dernier message: 15/09/2005, 14h04
  4. Réponses: 12
    Dernier message: 14/06/2004, 13h06
  5. [JList] Lecture des données sauvegardées dans un fichier
    Par Myogtha dans le forum Composants
    Réponses: 7
    Dernier message: 10/06/2004, 21h05

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