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

Langage C++ Discussion :

Traitement d'un fichier binaire


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut Traitement d'un fichier binaire
    Bonjour à tous,

    Actuellement j'ai un problème avec mon programme : Ce dernier doit lire un fichier binaire et "sauter" au fur et à mesure les parties du fichiers. Pour ce faire j'ai utilisé

    int a;
    File *fichier; //mon fichier binaire
    a= fgetc(fichier)

    J'utilise la fonction fgetc pour récupérer la valeur d'un octet en int, ainsi je peux utiliser les données de mon fichier. Pour sauter les parties de mon fichier j'utilise :

    fseek(fichier,pos,SEEK_SET);

    ou pos est une variable que j'incrémente au fur et à mesure en fonction de ma lecture. (J'ai essayé SEEK_CUR comme arguement, mais les résultats n'étaient pas ceux que j'attendais)


    Le fichier est assez long, mais le programme fonctionne sur une bonne partie jusqu'à ce que je constate qu'il lie de mauvaises données Et par la suite il reprend sa routine, et il retourne bien.

    Je vais vous dispenser de mon code assez complexe, parce qu'il faudrai l'explication du contexte. Après plusieurs recherches, j'ai cru comprendre que je n'utilisai pas la bonne méthode pour les fichiers binaires, et les tutos que j'ai trouvé ne me donnai pas satisfaction aux niveaux des résultats, la méthode que j'ai expliqué ci-dessus est celle qui s'est le plus rapproché des résultats attendus. Pourriez vous m'indiquez d'ou viens mon problème, ou qu'elle est la méthode juste pour mon application?

    Merci

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    avant toute chose: tu programmes en C ou en C++?

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    Je programme en C++, désolé de ne pas l'avoir précisé.

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 294
    Billets dans le blog
    2
    Par défaut
    Ok, alors en c++, pour la manipulation de fichiers on utilise les flux (stream en anglais) et non la structure FILE*. Tu devrais trouver à peu près toutes les réponses que tu cherches dans cette section de la faq

    Il y manque juste peut-être un mot sur les fonctions membres seekg() et tellg() qui permettent de se "déplacer" dans le fichier.

  5. #5
    Membre confirmé
    Inscrit en
    Mars 2011
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Mars 2011
    Messages : 62
    Par défaut
    C'est la première méthode que j'ai utilisé car je susi d'abord passé par la faq avant de poser la question. Je viens de réessayer et çe me donne ceci quand je li mon fichier binaire pour les 5 premières lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int xin=0;
    std::ifstream FileIn("stdf.std", std::ios_base::binary);
    while(i<5){
       FileIn.read(reinterpret_cast<char*>(&xin), sizeof(int));
       std::cout << xin << std::endl;}
    J'obtiens ceci :
    167772162
    394242
    -142470144
    536956131
    167837927


    Avec mon premier programme j'obtenais ces résultats qui étaient cohérent :
    2
    0
    0
    10
    2

    Et voici les valeurs hexadécimales des cinq premiers octects de mon fichier binaire :
    02 00 00 0A 02


    Voilà, j'ai vraiment du mal, avec toutes ces méthodes qui existent. Et je ne comprend pas du tout les données de la première méthode... Si quelqu'un pouvait m'éclairer..

  6. #6
    Membre expérimenté Avatar de Nogane
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    241
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 241
    Par défaut
    Bonjour,

    Quand vous utilisez la methode read, vous lisez 4 octets a chaque fois(sizeof(int)). xin devrai plutôt être un uint8_t.

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

Discussions similaires

  1. Traitement de fichier binaire
    Par fomazou dans le forum MATLAB
    Réponses: 5
    Dernier message: 02/12/2008, 17h30
  2. traitement fichier binaire
    Par noussa_nouha dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 21/10/2006, 14h45
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  5. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39

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