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 Perl Discussion :

Problème avec la fonction read.


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut Problème avec la fonction read.
    Bonjour, à tous,

    Voilà je désire trouver une chaîne dans un fichier binaire et je pense que la fonction read me permet ce genre de manipulation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    open (FILE, "</tmp/toto") or die "Lecture du fichier impossible";
    read (FILE, $tempo, 4, 610);
    print "$tempo";
    Mon problème réside dans l'utilisation de OFFSET qui ne semble pas fonctionné, car la lecture de mon fichier débute systématiquement au début du fichier sans tenir compte du décalage.

    Par avance merci.

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    je connais pas la fonction read, mais pourquoi pas lire ton fichier ligne par ligne et faire une regex pour rechercher ton motif???

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Je ne connais pas le contenu de ce que je cherche, mais sa position dans le fichier oui, donc l'usage d'une regex m'est impossible.

    Petite précision, j'utilise ActivePerl-5.8 sous Linux.

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par Whaouu
    Je ne connais pas le contenu de ce que je cherche, mais sa position dans le fichier oui, donc l'usage d'une regex m'est impossible.
    Qu'entends tu par la position dans le fichier???? Le numéro de la ligne???

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Merci pour ton aide,

    C'est un fichier binaire, et ce que je cherche commence a l'Offset E03 en Hexa ou 3587 ou Déc et se termine en E07.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    je ne maitrise pas les fichiers binaires!!!
    Ce que je veux savoir, il est formé comment? sur plusieurs ligne ou sur une seule ligne??
    Si c'est plusieurs lignes, veux tu une ligne du fichiers ou bien des infos se trouvant sur plusieurs lignes?
    Bref en fonction de cela une petite regex te reglera ton souci.
    peux tu afficher une portion de ton fichier? ça me donneraune idée!!!

  7. #7
    Candidat au Club
    Inscrit en
    Septembre 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Voir l'exemple 8-5 de l'adresse suivante:
    http://www.oreilly.com/catalog/cookbook/chapter/ch08.html

    Ils explique comment trouver une ligne à partir d'une adresse dans un fichier binaire.

    David

  8. #8
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Citation Envoyé par davlar_99
    Voir l'exemple 8-5 de l'adresse suivante:
    http://www.oreilly.com/catalog/cookbook/chapter/ch08.html

    Ils explique comment trouver une ligne à partir d'une adresse dans un fichier binaire.

    David
    Le probleme est qu'on ne sait pas concretement cequ'il cherche d'ou mes questions du dessus. Pas mal ton lien pour les debutants!!!

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu as mal compris le OFFSET de read() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    read FILEHANDLE,SCALAR,LENGTH,OFFSET
     
    ...
     
    An OFFSET may be specified to place the read data at some place in the string other than the beginning.
    Autrement dit cet OFFSET ne concerne pas le fichier lu, mais l'emplacement des données récupérés dans le scalaire de sortie.

    Pour manipuler un fichier binaire, il est essentiel de le mettre en mode binaire (pour éviter les conversions de fins de ligne qui décalent tout). Ensuite tu peux utiliser seek() pour te placer au bon endroit dans le fichier et ensuite read() pour lire ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open( FILE, '<:bytes' ,"/tmp/toto" ) or die "Lecture du fichier impossible";
    seek( FILE, 3587 );
    read( FILE, $tempo, 4 );
    print "$tempo";
    Simple et court !

    --
    Jedaï

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Août 2005
    Messages
    122
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 122
    Points : 136
    Points
    136
    Par défaut
    Citation Envoyé par Jedai
    Tu as mal compris le OFFSET de read() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    read FILEHANDLE,SCALAR,LENGTH,OFFSET
     
    ...
     
    An OFFSET may be specified to place the read data at some place in the string other than the beginning.
    Autrement dit cet OFFSET ne concerne pas le fichier lu, mais l'emplacement des données récupérés dans le scalaire de sortie.

    Pour manipuler un fichier binaire, il est essentiel de le mettre en mode binaire (pour éviter les conversions de fins de ligne qui décalent tout). Ensuite tu peux utiliser seek() pour te placer au bon endroit dans le fichier et ensuite read() pour lire ce que tu veux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    open( FILE, '<:bytes' ,"/tmp/toto" ) or die "Lecture du fichier impossible";
    seek( FILE, 3587 );
    read( FILE, $tempo, 4 );
    print "$tempo";
    Simple et court !

    --
    Jedaï
    Tu as entièrement raison ! j'avais mal interprété l'utilisation de l'offset de read, avec le seek (que je comptais utilisé si je ne parvenais avec read) ça fonctionne à merveille, je dois juste utilise le paramètre 0 pour indiquer une position absolue.

    Ce qui nous donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open( FILE, '<:bytes' ,"/tmp/toto" ) or die "Lecture du fichier impossible";
    seek( FILE, 3587, 0 );
    read( FILE, $tempo, 4 );
    print "$tempo";
    Merci pour votre aide à tous qui est très sympa !

  11. #11
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 852
    Points : 4 759
    Points
    4 759
    Par défaut
    Un petit tag Résolu si c'est OK, merci d'avance.
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

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

Discussions similaires

  1. Problème avec la fonction READ
    Par chiheb1111111 dans le forum VHDL
    Réponses: 2
    Dernier message: 14/09/2011, 21h25
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

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