perl - lecture d'un fichier par blocks en partant de la fin

perl - lecture d'un fichier par blocks en partant de la fin - Perl - Programmation

Marsh Posté le 11-02-2006 à 19:15:49    

Petite question avancee en ouverture et lecture de fichiers.
 
je dois ouvrir des fichiers faisant plusieurs go chacuns, tous composes de structures de 512 que j'unpackerait par la suite.
 
quelle maniere existe t il  pour lire un fichier comme ca.
 
en gros:
 
- ouvrir le fichier.
- se positionner a la fin - 512;
- lire la structure;
- lire la structure de 512 a 1024 au dessus;
et recommencer ainsi de suite....
 
merci d'avance pour votre aide

Reply

Marsh Posté le 11-02-2006 à 19:15:49   

Reply

Marsh Posté le 11-02-2006 à 19:48:35    

perldoc -f sysread

Reply

Marsh Posté le 11-02-2006 à 19:49:23    

perldoc -f binmode
 
(bien que ça soit noté dans la doc sysread)

Reply

Marsh Posté le 11-02-2006 à 20:11:43    

okay, si j'ai bien compris le man, ca devrait pouvoir se faire :-)
 
merci ;-)

Reply

Marsh Posté le 11-02-2006 à 20:48:39    

et après pack/unpack

Reply

Marsh Posté le 12-02-2006 à 18:16:13    

bon alors, je viens avec une nouvelle question:
 
on veut lire 512 par 512 en partant de la fin, normallement le premier while en commentaire devrait le faire, mais il n'affiche rien dans le printf, alors qu'un bon vieux read des familles marche.....
 
no comprendo
 
my $nb_reads = 1;
##while (sysread(FILE, $struct, $struct_size, $size - ($nb_reads * $struct_size)) != 0) {
##while (read(FILE, $struct, $struct_size) != 0) {
    my ($ut_name, $ut_id, $ut_line, $ut_host, $ut_session, $ut_type, $ut_pid,
 $e_termination, $e_exit, $ss_len, $sa_family, $ss_pad, $tv_sec, $tv_usec, $ut_pad) =
     unpack($unpack_tpl, $struct);
     
    print("name = $ut_name\n" );
    $nb_reads++;
}
 
 
merci d'avance

Reply

Marsh Posté le 12-02-2006 à 20:05:32    

détaille, regarde bien le retour de sysread, n'oublie pas le binmode, etc

Reply

Marsh Posté le 12-02-2006 à 20:06:26    

mais c'est tout aussi valide avec read en fait

Reply

Marsh Posté le 12-02-2006 à 20:07:07    

et sans doute mieux avec read. je sais pas pourquoi j'ai embrayé direct sur sysread ...

Reply

Marsh Posté le 12-02-2006 à 20:13:34    

en fait je viens de comprendre que le offset de sysread ne sert pas du tout a l'utilisation que je voulais en faire....
 
en relisant plusieurs fois le man et dans differentes versions, j'ai compris que l'offset servait en fait a sysread pour stocker ce qu'il a lu a un offset dans la variable...
 
un sysread(FILE, $var, 10, 512); stockera les 10 characteres lus a partir du charactere 512 dans $var, en rajoutant des \0 dans la chaine pour completer....
 
 
donc en fait je suis passe avec un seek.... et ca marche :-)
 
merci pour ton aide

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed