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 :

Accès direct fichier


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut Accès direct fichier
    Bonjour, je crée un programme pour écrire et lire un fichier. Je voudrais que celui-ci puisse afficher une ligne par accès direct mais je n'y parvient pas. Voilà mon 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    struct mesure
    {
            char nom[20];
            char reference[15];
            double resultat;
            void saisie();
            void affiche();
            void rang();
    };
     
    void mesure::saisie()
    {
            ofstream fichierOut("mesures.txt", ios::app);
            cout<<"Donnez le nom de la mesure : ";
            cin>>nom;
            fichierOut << "nom : " << nom;
            cout<<"Donnez la reference : ";
            cin>>reference;
            fichierOut << ", reference : " << reference;
            cout<<"Donnez le resultat de la mesure : ";
            cin>>resultat;
            fichierOut << ", resultat : " << resultat << "\n";
            fichierOut.close();
    }
     
    void mesure::affiche()
    {
         string line;         
         char recherche[256];          
         ifstream fichierIn("mesures.txt");
         cout << "nom de la mesure recherche : ";
         cin >> recherche;
         fichierIn.seekg(0,ios::beg);
         while(! fichierIn.eof() )
         {
                   getline(fichierIn, line);           
     
                   if(line.find(recherche)==0)
                   {
                                              cout<< line << "\n" << endl;
                   }
     
         }
         fichierIn.close();
    }
     
    void mesure::rang()
    {
         string line;
         double rang;
         ifstream fichierIn("mesures.txt");
         cout << "rang de la mesure recherche : ";
         cin >> rang;
         fichierIn.seekg(sizeof(*nom)+sizeof(*reference)+sizeof(resultat)* rang, ios::beg);
         getline(fichierIn, line);
         cout << line << "\n" << endl;
     
         fichierIn.close();
    }
    C'est dans la partie rang() que j'ai un soucis. Merci d'avance pour votre aide.

  2. #2
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(*nom)+sizeof(*reference)+sizeof(resultat)* rang, ios::beg
    ça ne peut pas marcher, ni nom, ni rang, ni résultat ne sont connus.
    il faut plutot écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(mesure.nom)+sizeof(mesure.reference)+sizeof(mesure.resultat)* rang, ios::beg
    ou remplacer par le nom des types.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Ca ne fonctionne toujours pas voilà ce que ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    main.cpp: In member function `void mesure::rang()':
    main.cpp:60: error: expected primary-expression before '.' token
    main.cpp:60: error: expected primary-expression before '.' token
    main.cpp:60: error: expected primary-expression before '.' token
     
    make.exe: *** [main.o] Error 1

  4. #4
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par bibeul Voir le message
    Ca ne fonctionne toujours pas voilà ce que ça m'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    main.cpp: In member function `void mesure::rang()':
    main.cpp:60: error: expected primary-expression before '.' token
    main.cpp:60: error: expected primary-expression before '.' token
    main.cpp:60: error: expected primary-expression before '.' token
     
    make.exe: *** [main.o] Error 1
    oups, erreur de ma part, il faut marquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(mesure::nom)+sizeof(mesure::reference)+sizeof(mesure::resultat)* rang, ios::beg

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Ca me fait à peu près comme au départ il ne m'affiche pas les lignes mais des petits morceaux par ci par la et parfois ne m'affiche rien.

  6. #6
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    en fait, c'est tout à fait normal : tes accès sont en texte (ascii) et sizeof() te renvoie une taille en nombre d'octets.

    si tu veux stoker tes données en binaire, regarde donc dans la faq.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    J'ai essayé en modifiant le saisie comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void mesure::saisie()
    {
            ofstream fichierOut("mesures.txt", ios::binary);
            cout<<"Donnez le nom de la mesure : ";
            cin>>nom;   
            fichierOut.write((char*)&nom, sizeof(nom));
            cout<<"Donnez la reference : ";
            cin>>reference;            
            fichierOut.write((char*)&reference, sizeof(nom));
            cout<<"Donnez le resultat de la mesure : ";
            cin>>resultat;
            fichierOut.write((char*)&resultat, sizeof(nom));
            fichierOut.close();
    }
    Mais quand j'ouvre le fichier il y a plein de caractère bizarre.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    voila la partie rang():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void mesure::rang()
    {
         double rang;
         ifstream fichierIn("mesures.txt", ios::binary);
         cout << "rang de la mesure recherche : ";
         cin >> rang;
         fichierIn.seekg(sizeof(nom)+sizeof(reference)+sizeof(double)* rang, ios::beg);
         fichierIn.read((char*)&nom, sizeof(nom));
         cout << nom;
         fichierIn.close();
    }
    Et cette fois-çi n'importe quel rang que je mette j'ai les même caractère en réponse pour tous les rang.

  9. #9
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par bibeul Voir le message
    Mais quand j'ouvre le fichier il y a plein de caractère bizarre.
    Normal puisque c'est écrit en binaire et non en ascii. ce n'est donc pas lisible par un éditeur de texte.
    Citation Envoyé par bibeul Voir le message
    voila la partie rang():
    Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void mesure::rang()
    {
         double rang;
         ifstream fichierIn("mesures.txt", ios::binary);
         cout << "rang de la mesure recherche : ";
         cin >> rang;
         fichierIn.seekg(sizeof(nom)+sizeof(reference)+sizeof(double)* rang, ios::beg);
         fichierIn.read((char*)&nom, sizeof(nom));
         cout << nom;
         fichierIn.close();
    }
    Et cette fois-çi n'importe quel rang que je mette j'ai les même caractère en réponse pour tous les rang.
    j'ai peur que quand tu fit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierOut.write((char*)&nom, sizeof(nom));
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fichierOut.write((char*)&reference, sizeof(nom));
    cela ne fasse quécrire l'adresse du tableau et non le tableau entier.


    Pour ce que tu veux faire, je te conseille de tout faire en ascii et de ne pas utiliser la méthode seekg, mais plutôt de mettre des délimiteurs lors de l'écriture (du genre espace) et de lire le fichier mots par mots :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(fichier>>nom>>reference>>resultat)
    {
     ....
    }
    bonne chance

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    Je ne comprends pas ce que je peux faire avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while(fichier>>nom>>reference>>resultat)
    {
     ....
    }
    En revanche je pense avoir trouvé quelque chose d'intéressant avec (setw()) pour effectuer les espaces mais avec rang() j'arrive à accéder à la première ligne du fichier mais pas aux autres. Voila 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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    struct mesure
    {
            char nom[20];
            char reference[15];
            double resultat;
            void saisie();
            void affiche();
            void rang();
    };
     
    void mesure::saisie()
    {
            ofstream fichierOut("mesures.txt", ios::app);
            cout<<"Donnez le nom de la mesure : ";
            cin>>nom;
            fichierOut << setw(20) << setiosflags(ios::left)<< nom;
            cout<<"Donnez la reference : ";
            cin>>reference;
            fichierOut << setw(15) << setiosflags(ios::left)<< reference;
            cout<<"Donnez le resultat de la mesure : ";
            cin>>resultat;
            fichierOut << setw(18) << setiosflags(ios::left)<< resultat << "\n";
            fichierOut.close();
    }
     
    void mesure::affiche()
    {
         string line;         
         char recherche[256];          
         ifstream fichierIn("mesures.txt");
         cout << "nom de la mesure recherche : ";
         cin >> recherche;
         fichierIn.seekg(0,ios::beg);
         while(! fichierIn.eof() )
         {
                   getline(fichierIn, line);           
     
                   if(line.find(recherche)==0)
                   {
                                              cout<< line << "\n" << endl;
                   }
     
         }
         fichierIn.close();
    }
     
    void mesure::rang()
    {
         string line;
         double rang;
         ifstream fichierIn("mesures.txt");
         cout << "rang de la mesure recherche : ";
         cin >> rang;
         fichierIn.seekg(( 20 + 15 + 18 ) * rang, ios::beg);
         getline(fichierIn, line);
         cout << line << "\n" << endl;
     
         fichierIn.close();
    }

  11. #11
    Membre Expert
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Par défaut
    Citation Envoyé par bibeul Voir le message
    Je ne comprends pas ce que je peux faire avec
    Je t'invite à te renseigner sur l'utilisation basique de la fonction fstream . Je n'ai pas trouvé de ressource dvp qui en parle (si un modo passe par là, je veux bien un lien), donc je te file cette doc en exemple.


    Bonne chance .

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 26
    Par défaut
    C'est bon entre deux j'y suis arrivé il n'y avait qu'une ligne à modifier. Je te remercie beaucoup pour ton aide. Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Fortran 77] Fichier à accès direct
    Par ERICKO dans le forum Fortran
    Réponses: 15
    Dernier message: 31/03/2009, 14h01
  2. Réponses: 5
    Dernier message: 02/10/2006, 22h54
  3. Réponses: 7
    Dernier message: 18/03/2006, 13h16
  4. Réponses: 37
    Dernier message: 30/11/2005, 19h41
  5. [TOMCAT] Comment empêcher l'accès direct aux fichiers
    Par thomine dans le forum Tomcat et TomEE
    Réponses: 17
    Dernier message: 14/04/2005, 10h19

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