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 :

ouverture de fichier seekg


Sujet :

C++

  1. #1
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut ouverture de fichier seekg
    Voila mon 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
    const int LGMAX_NOM_FICH = 20;
    #include <stdlib.h>
    #include <fstream>
    #include <iomanip>
    #include <iostream>
    
    using namespace std;
    
    main()
    {
     char nomfich [LGMAX_NOM_FICH + 1];
     int n, num;
     cout << "nom du fichier à consulter : ";
     cin >> setw (LGMAX_NOM_FICH) >> nomfich;
     ifstream entree (nomfich, ios::in);
     if (!entree) { cout << "Ouverture impossible\n";
                       exit(1);
                     }
     do
        { cout << "Numéro de l'entier recherché : ";
           cin >> num;
           if (num)
              { entree.seekg (sizeof(int) * (num-1), ios::beg);
                 entree.read ( (char *) &n, sizeof(int) );             
                 if (entree) cout << "-- Valeur : " << n << "\n";
                   else { cout << "-- Erreur\n";
                            entree.clear ();
                         }
             }
        }
     while (num);
     entree.close ();
    }
    Que font exactement les lignes en gras ? Que vient faire sizeof(int) * (num-1) ?

    Merci

  2. #2
    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
    La première ligne en gras déplace la position de lecture sur le num-ième entier dans le fichier.
    La seconde ligne effectue la lecture de cet entier et le place dans la variable n.

    Ceci-dit il y a au moins une erreur dans ce code : le fichier devrait être ouvert avec l'option ios::binary (ios::in est par contre redondant pour la classe ifstream).

  3. #3
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut
    merci pour ces informations.

    Mais je voudrais savoir pourquoi num-1 et à quoi sert vraiment sizeof(int) ?

    Merci d'avance.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    num-1, c'est, tout simplement, parce que quand tu demandes le 10 eme éléments d'une liste, tu compte à partir de 1, alors que, lors de l'ouverture du fichier, tu es déjà sur le premier numéro...

    Si le -1 n'était pas la, le pointeur sur la donnée du fichier se placerait juste avant le 11 eme entier, et ce serait donc lui que tu lirais (c'est l'histoire des poteaux de cloture )

    le sizeof(int) sert à connaitre le nombre d'octet utilisé par le système et le compilateur comme taille d'entier.

    En effet, il doit savoir de combien d'octets il doit se déplacer pour atteindre l'élément suivant (le "pas" en octets entre chaque entier).

    Le pas multiplié par l'écart(le nombre d'entiers à passer) indique à quel endroit il trouvera l'entier que tu recherches

    L'ouverture d'un fichier en binaire permet en effet de se déplacer à sa guise dans le fichier (vers l'avant ou vers l'arrière) et cela évite d'avoir à créer une boucle qui lira tous les entiers qui précedent celui que tu recherche...

    Sur un fichier tres important (plusieurs disaines de milliers d'entiers, par exemple) si tu veux l'entier numéro 10.000, faire une boucle qui lirait les 9999 premiers avant de te donner celui que tu recherche prendrait pas mal de temps...

    Alors que le fait de dire "je déplace le pointeur de fichier de 9999*la taille d'un entier", cela se fait en un seul temps (ou presque)...

    Tu gagnes donc énormément en temps d'exécution

    Je le sais, j'ai choisi des termes qui ne sont pas forcément justes... mais l'idée est de lui permettre de comprendre ce qui se passe
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut
    ok merci

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

Discussions similaires

  1. ouverture de fichier txt
    Par juguul dans le forum MFC
    Réponses: 11
    Dernier message: 18/12/2003, 09h44
  2. Ouverture de fichier en api
    Par Michaël dans le forum Windows
    Réponses: 9
    Dernier message: 10/12/2003, 16h47
  3. Ouverture de fichier
    Par Ricou.13 dans le forum VBA Access
    Réponses: 3
    Dernier message: 07/10/2003, 08h59
  4. Réponses: 2
    Dernier message: 26/02/2003, 15h18
  5. [VBA-E] Evenement ouverture de fichier
    Par gjeff dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 13/12/2002, 09h42

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