seek + truncate remplissent de binaire ! [RESOLU] - Perl - Programmation
Marsh Posté le 27-07-2010 à 15:23:20
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+,
Marsh Posté le 27-07-2010 à 18:47:24
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 !
Marsh Posté le 27-07-2010 à 19:22:40
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)
Marsh Posté le 27-07-2010 à 20:37:47
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+,
Marsh Posté le 27-07-2010 à 21:22:54
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 :
|
A+,
Marsh Posté le 28-07-2010 à 06:31:50
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 ?
Marsh Posté le 28-07-2010 à 09:32:03
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 :
|
A+,
Marsh Posté le 28-07-2010 à 09:35:55
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+,
Marsh Posté le 27-07-2010 à 10:16:09
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)