Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1339 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [RESOLU] seek + truncate remplissent de binaire !

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] seek + truncate remplissent de binaire !

n°2012015
MisterBark
be aware
Posté le 27-07-2010 à 10:16:09  profilanswer
 

Salut,
 
J'ai un probleme bizarre avec un de mes programmes. Je ne comprends vraiment pas !
 
Voila ce que je fais :
 
- j'ouvre avec sysopen en O_CREAT|O_RDWR
- je flock LOCK_EX
- seek(VAL, -100 , 2)  # afin d'etre sur de ma placer avant le debut de la derniere ligne (une ligne ne fera jamais 100 octets)
- je lis les lignes une a une while(defined($l=<VAL> ))){ et en profite pour faire $lastlen = length($l)
- apres le while mon $lastlen contient donc la longueur de la derniere ligne lue
- seek(VAL, (0-$lastlen) , 2 )
- truncate(VAL, 0)

- print(VAL "nouvelle ligne\n" )
 
Les lignes rouges créent un gros probleme :
Ca rempli toutes les lignes precedant ma nouvelle ligne de données binaires ! (^@)
 
Je suis sur que ca vient de ces 2 lignes car elles sont dans un if et ca n'arrive que lorsque la condition est vrai.
(le but du if est que la nouvelle ligne remplace la derniere, dans les autres cas, on l'ajoute apres)
 
J'ai essayé d'appeler seek des 2 autres manieres (0 avec tell pour la position depuis le debut, et 1 pour la position actuelle qui est de tte facon déja la fin du fichier) et ca produit exactement la meme chose.
 
MERCI BEAUCOUP pour vos idées ! :)


Message édité par MisterBark le 28-07-2010 à 06:32:44

---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
mood
Publicité
Posté le 27-07-2010 à 10:16:09  profilanswer
 

n°2012170
gilou
Modérateur
Modzilla
Posté le 27-07-2010 à 15:23:20  profilanswer
 

Et en fait, tu veux faire quoi exactement?
Parce que plutôt de comprendre un truc pas clair, si j'en connaissais le but (écrire conditionnellement dans un fichier?), ça aiderait.
Si c'est pour modifier un fichier "en place", pourquoi ne pas passer par le module Tie::File?
A+,


Message édité par gilou le 27-07-2010 à 15:50:01

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2012246
MisterBark
be aware
Posté le 27-07-2010 à 18:47:24  profilanswer
 

Ce que je veux faire c'est :
- ajouter une/des lignes a la fin d'un fichier
- dans certains cas, supprimer la derniere ligne avant d'ajouter la/les lignes
- ces cas dépendent du contenu de cette derniere ligne
 
Sincèrement j'essaye d'éviter au maximum d'utiiliser des modules, faut pas oublier que ca va les chercher sur le disque à chaque fois. Est-il vraiment nécessaire d'appeler un module pour quelque chose d'aussi simple ?
 
J'aimerais beaucoup faire ca sans module, mais propre car ce programme est appelé souvent et le fichier est parfois un peu gros.
Merci !


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
n°2012249
MisterBark
be aware
Posté le 27-07-2010 à 19:22:40  profilanswer
 

PS: pour info, ce qui est rempli de binaire avec mon code, ce sont les anciennes lignes existantes (car le fichier fait la meme taille apres le désastre)


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
n°2012262
gilou
Modérateur
Modzilla
Posté le 27-07-2010 à 20:37:47  profilanswer
 

Citation :

Sincèrement j'essaye d'éviter au maximum d'utiiliser des modules, faut pas oublier que ca va les chercher sur le disque à chaque fois.


Euh, un use module; ça préloade le module au départ, donc tu ne perds pas grand chose, puisque tu es de toute façon en train de lire le fichier de ton script.
Et si tu utilise ton programme pour du script serveur web, il y a moyen de demander a ce que ce soit préloadé, alors je ne vois pas trop le problème. Un des grands intérêts de perl, c'est justement cette immense bibliothèque de modules.
Le seul cas de figure ou ça pourrait impacter, c'est si tu lançais ton script perl a de nombreuses reprises au lieu de le lancer une fois sur une liste de fichiers.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2012277
gilou
Modérateur
Modzilla
Posté le 27-07-2010 à 21:22:54  profilanswer
 

Bon sinon, sans se lancer dans du unbuffered I/O, ce genre de manip marche très bien pour changer la dernière ligne par une autre:
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my $file = "myttest.txt";
  5. open (FH, "+< $file" ) or die "can't open $file: $!";
  6. my $addr;
  7. while ( <FH> ) { $addr = tell(FH) unless eof(FH) }
  8. truncate(FH, $addr) or die "can't truncate $file: $!";
  9. seek(FH, $addr, 0);
  10. print(FH "la nouvelle ligne\n" );
  11. close(FH);


A+,


Message édité par gilou le 27-07-2010 à 21:24:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2012305
MisterBark
be aware
Posté le 28-07-2010 à 06:31:50  profilanswer
 

aie aie aie... je suis un crétin !
merci BEAUCOUP !
 
mon erreur de base est que j'ai toujours pensé que l'argument de truncate était la longueur restante a partir de la postion actuelle...
Donc je me disais: suffit de se mettre au bon endroit puis faire truncate(FH, 0) ....
 
Et du coup tu ne trouves pas que c'est tout de meme mieux que de charger un module ?


Message édité par MisterBark le 28-07-2010 à 08:01:50

---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
n°2012324
gilou
Modérateur
Modzilla
Posté le 28-07-2010 à 09:32:03  profilanswer
 

Non, je ne trouve pas.
Avec un module comme Tie::File, je fais la même chose en ne me concentrant que sur ce qui m'intéresse, pas les détails d'ouverture et positionnement dans le fichier:
 

Code :
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. use Tie::File;
  5. my $file = "myttest.txt";
  6. tie my @array, 'Tie::File', $file or die "can't open $file: $!";
  7. $#array -= 1;                     # On vire la dernière ligne
  8. push @array, "ma nouvelle ligne"; # On en ajoute une en fin de fichier
  9. untie @array;


 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2012325
gilou
Modérateur
Modzilla
Posté le 28-07-2010 à 09:35:55  profilanswer
 

Citation :

mon erreur de base est que j'ai toujours pensé que l'argument de truncate était la longueur restante a partir de la postion actuelle...

Non: On tronque un fichier à telle longueur.
Mais maintenant, je comprends le pourquoi du code initial.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [RESOLU] seek + truncate remplissent de binaire !

 

Sujets relatifs
problème de div position absolute et IE [RESOLU][WebDev15] GUID Ldap ou comment récupérer de l'hexadecimale..
[Resolu] Bug avec éléments flottants sur mise en page[Resolu] Problème formulaire envoi mail
[Résolu][Batch] Comparaison chaines de caractères[RESOLU] [Plugin] Ajouter patch à un plugin
[Resolu]Site mal aligné[RESOLU] [javascript] recharger une fenetre (grand) parent
[RESOLU] Problème tableau php -> javascript[résolu][GWT + GXT] appel RPC
Plus de sujets relatifs à : [RESOLU] seek + truncate remplissent de binaire !


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR