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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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, 14h12
  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, 21h06
  3. Réponses: 10
    Dernier message: 19/06/2006, 19h04
  4. Réponses: 3
    Dernier message: 22/05/2006, 16h02
  5. ajout de données à partir d'un fichier texte
    Par drakenzara dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 14/04/2006, 12h39

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