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 :

lecture d'un fichier binaire


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut lecture d'un fichier binaire
    Bonjour, je souhaite lire un fichier binaire. En allant sur google et la faq c++ de ce forum, j'ai compris l'utilisation des fonctions read() et write(). J'ai bien compris qu'on lit octet par octet...

    Mais mon problème est le suivant : je veux lire un fichier généré par une machine de mesure. Ce fichier contient N1 lignes d'entête (date de la mesure, nom de la machine, commentaire de l'opérateur,...) et N2 lignes de mesure (contenant 5 colonnes).

    Comment lire la ligne "commentaire" ? Car elle peut contenir autant de caractères qu'on veut (en général il n'y en aura pas non plus 150 000)

    Comment savoir que je suis arrivé à la fin de mon fichier ? Le nombre de lignes de données expérimentales dépend du matériau mesuré... Avec un fichier texte je faisais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(std::getline(fid, line))
    {
     
    }
    En fait, j'aimerais bien faire l'algorithme suivant :

    1) lire tout le fichier et le stocker dans un std::vector<std::string> >
    2) spliter chaque std::string pour ne récupérer que les données qui m'intéressent

    Quelqu'un aurait-il une idée pour répondre à mes 2 questions ?

    Merci d'avance

  2. #2
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Sans la spécification précise du format utilisé par la machine, il va être difficile de t'aider. Tout ce qui me vient à l'esprit, c'est que le caractère \0 encode une fin de ligne en ASCII. Encore faut il que ce soit le choix d'implement de la machine.

    Tu peux nous en dire plus ?
    Find me on github

  3. #3
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Comme jblecanard, j’essaierais dans un premier temps de lire le champ "commentaire" caractère par caractère jusqu'à trouver un '\0', en croisant les doigts pour qu'il n'y ait pas de problème d'endiadness, d'unicode, d'absence de '\0'etc. dans le fichier binaire

    Donc qqchose comme ça :

    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
    std::ifstream ifs("file.data", std::ios::binary);
     
    //
    //... read other field...
    //
     
    // read commentaire
    std::string commentaire;
    char c;
    while(ifs)
    {
      ifs.read(&c, 1);
      if(c != '\0')
      {
         commentaire.push_back(c);
      }
      else
      {
         break;
      }
    }
    Si ça ne fonctionne pas, je crains qu'il ne faille contacter l'auteur du fichier binaire pour lui demander les spécifications du format, ou alors l'inspecter avec un éditeur de texte du genre ultraedit pour le comprendre par toi-même.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    merci pour vos réponses.

    Et avez-vous une idée de la manière dont je pourrais détecter le nombre de lignes de mon fichier ? Car bien que le format soit toujours le même (N1 lignes d'entête, 5 colonnes etc..), le nombre de lignes N2 de données expérimentales est quant à lui variable.

    Merci encore

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut
    Citation Envoyé par salseropom Voir le message
    Bonjour,

    merci pour vos réponses.

    Et avez-vous une idée de la manière dont je pourrais détecter le nombre de lignes de mon fichier ? Car bien que le format soit toujours le même (N1 lignes d'entête, 5 colonnes etc..), le nombre de lignes N2 de données expérimentales est quant à lui variable.

    Merci encore
    Une fois que tu as déterminé la position de la première mesure, ce ne sera pas le plus difficile :

    Les mesures sont en effet, toujours du même type, et tu peux donc te baser sur l'entrée de la FAQ Comment calculer la taille d'un fichier ? pour savoir la taille totale des données à lire.

    Il te suffit ensuite de diviser cette taille par la taille du type de données que tu lis pour obtenir le nombre de données

    Il me semble cependant dangereux de permettre l'écriture de commentaires de tailles inconnue : en théorie, les en-têtes de fichiers binaires ont une taille fixe, ce qui permet de savoir exactement à quelle position commencent réellement les données
    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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2006, 13h06
  2. lecture d'un fichier binaire
    Par booby dans le forum C
    Réponses: 17
    Dernier message: 20/09/2006, 16h11
  3. lecture d'un fichier binaire
    Par Tonta dans le forum C++
    Réponses: 1
    Dernier message: 14/04/2006, 06h53
  4. lecture d'un fichier binaire en VB
    Par olivier] dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/12/2005, 11h17
  5. Lecture d'un fichier binaire
    Par Gloubie dans le forum Langage
    Réponses: 9
    Dernier message: 05/12/2005, 12h51

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