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 :

creer un fichier binaire


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut creer un fichier binaire
    Bonjour a tous
    Ma requete est simple mais je n'arrive pas a trouver la solution sur le net.
    J'aimerais creer un fichier binaire avec une taille définie, de 200ko par exemple.
    Comment puis je le faire en PERL ?

    (j'ai essayé le coup du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system(`dd if=$filein of=$fileout bs=1k count=200`);
    mais il ne me sort qu'un fichier de sortie $fileout nul ?!
    Autre solution plus simple peut-etre et plus efficace surtout ?
    )


    Merci pour votre aide
    pepito31

  2. #2
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Donc, ce que tu veux faire, ça n'est pas créer un nouveau fichier, mais faire une copie partielle d'un fichier existant, c'est bien ça ? Histoire qu'on se comprenne bien.
    There's nothing like $HOME!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut
    Non non, pardon.
    J'ai tenté le dd pour voir si ca pouvait marcher comme ca.

    Non, ce que je voudrais, c'est creer un fichier binaire (qui n'existe donc pas) avec une taille en octet fixée. C'est tout.

    Merci

  4. #4
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    Ah, alors je vois une solution possible utilisant la fonction pack. Je ne dis pas qu'elle est optimale, mais elle marche. Il y a sans doute mieux à utiliser dans un module ou un autre.
    Voici comment je remplirais un fichier d'octets nuls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print {$out} pack "c", 0 for(1..$size);
    avec $out, bien sûr, comme handle d'un fichier ouvert en écriture, et $size la taille souhaitée (dans ton cas, 204800), pack "c",0 renvoyant un caractère nul.
    Autre façon de procéder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print {$out} pack "c*", map {0} (1..$size);
    Ici, grâce au quantificateur * présent après le c dans le template, toute la liste qui suit, générée par map, est convertie en caractères signés. Je crois que c'est un brin plus propre que ma solution précédente, mais c'est juste une intuition.
    There's nothing like $HOME!

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Juin 2007
    Messages : 104
    Points : 47
    Points
    47
    Par défaut Super !
    J'ai testé la premier solution et ca fonctionne (excepté les {} dans le print) :
    voici le code qui marche pour générer un binaire via ta solution schmorgluck :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     open(BIN,">$myfile");
                     for (my $i = 0; $i < 1024*$Size; $i++) {print (BIN pack ("c",0));}
                  close(BIN);
    Merci encore pour ton aide.

    PS (j'ai tenté la 2eme soluce avec le map, mais il ne veut pas du map{0}) ?
    pepito

  6. #6
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut
    J'ai testé mes deux solutions, elles marchent sans problème, mais j'aurais dû indiquer comment j'ouvrais le fichier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    open my $out, ">$file";
    Ce qui crée un handle de fichier indirect $out.
    Quant au {0} dans map, il ne pose aucun problème, s'il y a problème il vient d'ailleurs. Tu n'aurais pas ajouté une virgule intempestive, des fois ?

    Du reste, ta variante est correcte, y a pas, mais d'une façon générale il vaut mieux éviter, en Perl, de rester trop attaché aux syntaxes typiques du C, ça peut géner le raisonnement. En Perl on ne se sert généralement de cette forme de for que quand c'est indispensable.
    There's nothing like $HOME!

  7. #7
    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
    Le pack n'est pas vraiment utile ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    open my($out), '>:raw', $file
      or die "$!\n";
    print {$out} "\0" x (1024 * 200);
    close $out;
    --
    Jedaï

  8. #8
    Membre confirmé
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Points : 558
    Points
    558
    Par défaut

    Cette notation m'était complètement sorti de la tête. Comme quoi il vaut mieux ne pas tout oublier du C.
    There's nothing like $HOME!

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

Discussions similaires

  1. cherche source ou cours comment creer fichier binaire
    Par ouldfella dans le forum Delphi
    Réponses: 2
    Dernier message: 14/06/2006, 15h35
  2. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19
  3. fichier binaire ou texte
    Par soussou dans le forum C++Builder
    Réponses: 4
    Dernier message: 14/06/2002, 13h39
  4. Réponses: 19
    Dernier message: 24/05/2002, 16h36
  5. [langage] comment créer des fichiers ?
    Par Anonymous dans le forum Langage
    Réponses: 3
    Dernier message: 05/05/2002, 16h33

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