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 :

lire dans un fichier binaire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Par défaut lire dans un fichier binaire
    Bonjour,

    voila je vous explique mon probleme. J'ai un fichier binaire dont les enregistrements sont inscrit de cette manière: arb0gui30tex70

    je souhaite recuprer les infos pour les stocker dans une structure de ce type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct _Un_mot
    {
    	char mot[2];
    	int position;
    }
    je ne sais pas quelle fonction utilisé !
    fgets (ok pour les caracteres ms pas pr les int)
    fscanf (lit tout le fichier en un bloc, c'est pas ce que je cherche)

    merci de votre aide!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par johncrom Voir le message
    Bonjour,

    voila je vous explique mon probleme. J'ai un fichier binaire dont les enregistrements sont inscrit de cette manière: arb0gui30tex70
    !
    Il nous faut plus d'infos :

    - Ce que tu appelles « mot », c'est ce qui se trouve entre les chiffres ?
    - Tes enregistrements sont-ils de taille fixe ?
    - Sinon, qu'est-ce qui les sépare ? Un caractère ? Un index ?

    Tout cela va fortement influer sur l'approche que tu vas utiliser. Par exemple, si les enregistrements sont de taille fixe, la position des mots est prédictible. Le plus efficace consiste alors à définir une structure au format de l'enregistrement, mapper le fichier en mémoire et le considérer comme un énorme tableau que tu parcoureras avec un pointeur.

    Si ce n'est pas le cas, tu peux utiliser fgetc() pour égrenner les caractères, et arrêter dès que tu trouves un chiffre. Tu auras alors isolé les position du début et de la fin de ton mot.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 12
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Il nous faut plus d'infos :

    - Ce que tu appelles « mot », c'est ce qui se trouve entre les chiffres ?
    - Tes enregistrements sont-ils de taille fixe ?
    - Sinon, qu'est-ce qui les sépare ? Un caractère ? Un index ?

    Tout cela va fortement influer sur l'approche que tu vas utiliser. Par exemple, si les enregistrements sont de taille fixe, la position des mots est prédictible. Le plus efficace consiste alors à définir une structure au format de l'enregistrement, mapper le fichier en mémoire et le considérer comme un énorme tableau que tu parcoureras avec un pointeur.

    Si ce n'est pas le cas, tu peux utiliser fgetc() pour égrenner les caractères, et arrêter dès que tu trouves un chiffre. Tu auras alors isolé les position du début et de la fin de ton mot.

    D'abord merci de ta reponse.

    1. Pour la variable mot, il s'agit bien de ce qui se trouve entre les chiffres.
    2. Les mots sont de taille fixe (3car. donc pas de probleme si je veux les scanner avec gets() ), la position est un int (le chiffre entre les mots, c'est la position du mot en octet dans le fichier) .

    En fait il s'agit d'un index que je doit justement placer en memoire. Donc le plus simple pour toi serait d'allouer de la memoire pour l'ensemble de l'index et de le placer d'un seul coup?

    en fait tu viens d'allumer la loupiote dans ma tete lol...merci

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par johncrom Voir le message
    2. Les mots sont de taille fixe (3car. donc pas de probleme si je veux les scanner avec gets() ), la position est un int (le chiffre entre les mots, c'est la position du mot en octet dans le fichier) .

    En fait il s'agit d'un index que je doit justement placer en memoire. Donc le plus simple pour toi serait d'allouer de la memoire pour l'ensemble de l'index et de le placer d'un seul coup?
    D'accord. Donc, ton fichier binaire est une table de mots de trois caractères, tous suivis de leur position dans un autre fichier. La taille des mots eux-même est fixe (3 caractères), mais la position qui les suit est écrite avec un nombre variable de chiffres. C'est bien cela ?

    Dans ce cas, tu déclares une instance de la structure que tu nous as montrée et tu prends soin d'initialiser « position » en la mettant à zéro, et avec mots[3] au lieu de mots[2].

    Ensuite, le mieux est de faire trois fgetc() successifs (pas besoin de déclarer une boucle pour cela) et mettre leurs résultats dans mots[0], mots[1] et mots[2].

    Puis tu lis les caractères suivants un par un, toujours en utilisant fgetc(). Tant que le caractère lu est un chiffre, tu mets à jour le contenu de position. Comment ? En le multipliant par 10 et en lui ajoutant la valeur en décimal du chiffre que tu viens de lire. Dès que ce n'en est plus un, alors tu fais un tour et tu reprends la procédure au début.

    Attention : tu as besoin de lire le premier caractère du mot suivant pour savoir que tu as fini de traiter le précédent, donc il faudra en tenir compte au prochain tour de boucle. D'autre part, il faut vérifier que fgetc() ne t'as pas renvoyé EOF au cours du traitement.

    Bon courage.

  5. #5
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Attention : tu as besoin de lire le premier caractère du mot suivant pour savoir que tu as fini de traiter le précédent, donc il faudra en tenir compte au prochain tour de boucle
    Ou appeler ungetc() pour remettre ce caractère dans le flux
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  6. #6
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 486
    Par défaut
    Citation Envoyé par ram-0000 Voir le message
    Ou appeler ungetc() pour remettre ce caractère dans le flux
    Oui, mais est-ce un bon conseil ? Selon la man-page, un seul retour est garanti, ce qui est suffisant dans le cas présent, mais quand même.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 04/04/2014, 15h02
  2. Comment lire une chaîne dans un fichier binaire?
    Par dot-_-net dans le forum Débuter
    Réponses: 9
    Dernier message: 18/05/2008, 23h13
  3. Réponses: 10
    Dernier message: 09/02/2008, 11h40
  4. Lire dans un fichier binaire
    Par poche dans le forum C
    Réponses: 4
    Dernier message: 20/03/2007, 09h51
  5. Lire et écrire dans un fichier binaire
    Par poche dans le forum C
    Réponses: 17
    Dernier message: 19/03/2007, 16h52

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