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 :

[Fichier binaire] Ajout de données


Sujet :

Langage Perl

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut [Fichier binaire] Ajout de données
    Bonjour,

    Je cherche a rajouter a la fin de tout les fichiers binaires d'un répertoire trois mots:

    0x0000
    0x0000
    0xFFFE

    Voici mon code:
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #!/usr/bin/perl -w
    use strict;
    use warnings;
    use File::Find;
     
    #********************************************
    #* list script variable *********************
    #********************************************
    my $etest_path;                                    # data
    my $size_files = 0;
    my $size_dirs  = 0;
    $etest_path = shift or usage() and die;
     
    # -- check all etest input files in etest directory
    #    save all files in @files, all folders in @dirs
    find( \&push_filename, "$etest_path" );
    my(@files, @dirs);
    sub push_filename {
      push @files, $File::Find::name if -f $_;
      push @dirs, $File::Find::name if -d $_;
    }
     
    # -- parse two lists
    #    create text file with all patterns path
    open(OUT, ">$etest_path/patterns_path.txt") and print STDERR "  o file [patterns_path.txt] created\n" or print STDERR "  --> !Cannot open OUTPUT [patterns_path.txt]!\n" and die;
    while(exists $files[$size_files]){
    	print " -- $files[$size_files]\n";
    	# -- output file : no process
    	if($files[$size_files] =~ /(.out|.out_|.txt|.cod|.cyc_)$/i){}
    	# -- save etest input
    	else{ print OUT "$files[$size_files]\n"; 
    		    # -- add three words at eof (0x0000, 0x0000, 0xFFFE)
    		    &add_data_at_eof($files[$size_files]); }
    	$size_files++;
    }
     
    while(exists $dirs[$size_dirs]){
    	print " ** $dirs[$size_dirs]\n";
    	$size_dirs++;
    }
     
    sub add_data_at_eof{
      my $file   = $_[0];
      my @values = (0,0,65534);
      # -- open input file 
      sysopen (FIC ,">>$file",O_RDWR) or print STDERR "  --> !Cannot open file [$file]!\n" and die;
      # -- write three data at eof
      for my $value(@values){
        my $temp=pack('S',$value);
        syswrite(FIC,$temp,2);
      }
    Le probleme c'est que mon sysopen ne marche pas:
    Bareword "O_RDWR" not allowed while "strict subs" in use at...

    Quelqu'un peut il m'expliquer ceci est du a quoi car je ne comprend pas, est ce a cause du strict ? si oui comment faire alors ?

    Merci beaucoup d'avance,

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Il manquait une ligne...
    use POSIX qw(fcntl_h);

    A voir si ca fonctionne maintenant.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Le probleme est le suivant désormais:

    Les 3 données sont écrites en début de fichier, existe t il une maniere directe de les insérer en fin de fichier ? Afin d'éviter de passer par un tableau tampon...
    edit : impossible de l'ouvrir avec +>

    Merci

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Pour ajouter du contenu à la fin d'un fichier ouvert avec sysopen(), il faut utiliser le flag O_APPEND dans l'argument MODE, et le nom de fichier seul, sans le préfixe >> qui est fait pour open(). Par ailleurs s'il s'agit de fichiers binaires il peut être utile d'ajouter O_BINARY également.
    Voir perldoc perlopentut pour les explications complètes.

  5. #5
    Expert confirmé
    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
    Par défaut
    Voici une façon de faire qui n'utilise pas sysopen (a priori à éviter sauf si tu as des besoins bien particulier...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sub add_data_at_eof{
      my $file   = $_[0];
      my @values = (0,0,65534);
      # -- open input file 
      open my($fh), '>>:raw', $file
        or die "  --> !Cannot open file [$file] : $! !\n";
      # -- write three data at eof
      print $fh pack('SSS',@values);
    }
    --
    Jedaï

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Bonjour,

    Mon code est sensiblement le meme, l'utilisation de '>>:raw' remplace le binmode ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub add_data_at_eof{
    	my $file   = $_[0];
      my @values = (0,0,65534);
      # -- save the content of input pattern
      #sysopen (FIC ,"$file",O_RDWR) or print STDERR "  --> !Cannot open file [$file]!\n" and die "$!";
      open (FIC, ">>$file"); 
      binmode FIC;
      for my $value(@values){
        my $temp=pack('S',$value);
        print FIC $temp;
      }
      close (FIC);
    }
    Qu'est ce qu'y est a éviter: l'exemple que vous m'avez posté ou l'utilisation de sysopen ? D'ailleurs, quelles sont les utilités des fonctions sysXXXXX si elles ont des équivalences directes ?
    Merci d'avance

  7. #7
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Mon code est sensiblement le meme, l'utilisation de '>>:raw' remplace le binmode ?
    Oui, de plus j'utilise une forme à trois arguments de open(), plus sûre, j'utilise également des filehandles lexicaux ($fh) au lieu d'un glob (FIC), ce qui est à la fois plus sûr (les GLOB sont des variables globales, tu peux écraser par inadvertance un filehandle que tu avais ouvert auparavant, surtout si tu utilises des noms aussi courant que FIC) et plus pratique (dans ma version il n'y pas de close() et ce n'est pas un problème parce que la portée lexicale de mon $fh fait que le fichier est fermé automatiquement à la fin de la fonction, ta première version n'avait pas de close() et avec un GLOB il n'était pas effectué automatiquement). En bref ma façon de faire représente un Perl "moderne", c'est-à-dire usant les idiomes et facilités recommandées depuis 6-7 ans, tandis que ta méthode date de plus de 10 ans et présente des risques inutiles.

    Citation Envoyé par sone47 Voir le message
    Qu'est ce qu'y est a éviter: l'exemple que vous m'avez posté ou l'utilisation de sysopen ? D'ailleurs, quelles sont les utilités des fonctions sysXXXXX si elles ont des équivalences directes ?
    Ta première version avec sysopen() était à éviter. Tu ne devrais pas utiliser sys*() dans un code normal, il s'agit des appels systèmes basiques, en tant que tels ils te donnent accès à des détails bas-niveau fort rarement utiles et pas toujours portables d'un système à l'autre... open() représente la solution correcte lorsque tu peux l'utiliser, c'est une surcouche d'abstraction, permettant généralement une utilisation plus commode des fichiers et offrant des facilités portables entre les différents OS supportés par Perl (ou éventuellement simulés sur ceux de ses OS qui ne les supportent pas nativement). open() est une fonction extrêmement puissante quand on connaît toutes ses possibilités.

    --
    Jedaï

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Ok merci beaucoup pour ces explications,
    Je vais basculer mon script en suivant vos conseils,

    Merci encore

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

Discussions similaires

  1. C#: Ouvrir un fichier Excel, ajouter des donneés, et enregistrer
    Par soufian1364 dans le forum Services Web
    Réponses: 4
    Dernier message: 24/03/2009, 15h12
  2. [C# 2.0] Base de données versus fichier binaire.
    Par Pierre8r dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/07/2006, 22h06
  3. Réponses: 10
    Dernier message: 19/06/2006, 20h04
  4. Réponses: 3
    Dernier message: 22/05/2006, 17h02
  5. ajout de données à partir d'un fichier texte
    Par drakenzara dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2006, 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