2010-04-28 6 views
1

J'essaie de lire un fichier binaire de 40 octets à la fois, puis de vérifier si tous ces octets sont 0x00, et si c'est le cas, ignorez-les. Si ce n'est pas le cas, il les réécrira dans un autre fichier (en supprimant simplement les gros blocs d'octets nuls).Pourquoi est-ce que j'obtiens un "mauvais descripteur de fichier" quand j'essaie de lire un fichier avec Perl?

Ce n'est peut-être pas le moyen le plus efficace de le faire, mais cela ne m'inquiète pas. Cependant, en ce moment je reçois une erreur de "Bad File Descriptor" et je n'arrive pas à comprendre pourquoi.

my $comp = "\x00" * 40; 
my $byte_count = 0; 

my $infile = "/home/magicked/image1"; 
my $outfile = "/home/magicked/image1_short"; 

open IN, "<$infile"; 
open OUT, ">$outfile"; 
binmode IN; 
binmode OUT; 
my ($buf, $data, $n); 
while (read (IN, $buf, 40)) { ### Problem is here ### 
    $boo = 1; 
    for ($i = 0; $i < 40; $i++) { 
    if ($comp[$i] != $buf[$i]) { 
     $i = 40; 
     print OUT $buf; 
     $byte_count += 40; 
    } 
    } 
} 
die "Problems! $!\n" if $!; 

close OUT; 
close IN; 

Je l'ai marqué d'un commentaire où il casse. Merci pour toute aide!

+0

Vous pouvez également lire et http://stackoverflow.com/questions/1479741/why-is-three-argument-open-calls-with-lexical-filehandles-a-perl-best-practice appliquer les pratiques qui s'y trouvent. Les handles de fichiers globaux peuvent vous mener à un monde de mal plus tard quand vous vous y attendez le moins. – Ether

Répondre

5

Vous pouvez vérifier si open ne renvoie pas d'erreur.

open IN, "<$infile" or die "Can't open $infile: $!"; 
+0

Comment embarrassant ... Oui, c'était le problème. Il est maintenant fixé. Merci! – Magicked