read関数でのファイル書き込みについての問題

このQ&Aのポイント
  • read関数を使用してバイナリやASCIIのファイルの一部を読み込み、別のファイルに書き出したいが、上手くいかない。
  • 677byteまでを書き込みたいが、実行すると書き出されない。
  • CTFHのファイルは作成されるが、0byteの状態になる。
回答を見る
  • ベストアンサー

read関数で読み込んだ内容をファイルに書き込めない

バイナリ、asciiのファイルの一部を読み込み、ファイルへ書き出したいのですが、ファイルへ書き出しが上手くいきません。 以下、一部です。 open(FH,$c_file); binmode FH; open(CTFH,">$cd_tmp"); binmode(CTFH); if($i == 1){ $result = read(FH,$cd,677); print $result."\n"; print CTFH $cd; print $cd; } 後でcloseしています。 677byteまでをCTFHに書き込みたいのですが、書き込めていません。 実行した際にprintで$resultには677が出力され、$cdも同様に 677byteの内容が実行時に出力されます。 ちなみにCTFHのファイルは作成されますが0byteと いう形で何も書き出されていない状態になっています。 どうしてなのかわからず煮詰まっています。 アドバイスをください。

  • Perl
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

$i という変数がどこから沸いて出たのかよくわからないのですが、 質問にあるコードはループの一部だったりしませんか? んで、$i がループの制御変数だったりとか。 仮に、$i が0から5まで変化すると仮定すると、 1のときに書き込んだ内容は、2のときの書き込みオープンで消えてなくなります。

kyu-p-
質問者

お礼

デバッグをしていて、ループを外すのを忘れていました。 無事に確認することができました。 ありがとうございました。

関連するQ&A

  • Perlでのファイル一括読み込み

    Perlにてファイルの一括読み込みを以下記述で実施しております。 実行環境はAIXです。 ------------------------------- #!/usr/bin/perl open(FH,"/tmp/filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- 上記内容をWindows XPにて実行した場合、何も表示されません。 print文が動いていないのか、ファイルの読み込みができていないのか不明です。 ファイルのパスは以下のように変更しております。 ------------------------------- open(FH,"C:\filename1.txt"); @aaa=<FH>; close(FH); print "@aaa\n"; ------------------------------- Windowsにて動作するようにはどのようにすれば宜しいのでしょうか? 初歩的な質問かもしれませんが、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 圧縮ファイルの取得

    http://okwave.jp/qa/q8823112.html こちらで質問させていただいたように、/public_html/file.zipではなく、/file.zipの ファイルをダウンロードさせるために以下の方法を取りました。 print "Content-type: application/x-tar\n\n"; open( FH, "$filename" ); binmode FH; binmode STDOUT; print <FH>; close( FH ); この方法では、ブラウザで表示させてダウンロードできるようになったのですが、 これをperlで、wgetか、何かを使って取得したいと考えています。 ところが、wgetで試したところ、zipファイルではなく、cgiページ自体のソースの取得になってしまいました。 zipファイルを取得するにはどのようにしたらよいのでしょうか。 perlの知識があまりないので、どうしても解決できません。 宜しければ具体的に書き方を教えていただけると大変助かります。どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl
  • HTMLのファイルにCGI処理結果を表示する

    まずトップページはhtmlで作ります。 そのトップページにいつも変化する所があるのでcgiで処理を施したものをhtmlに貼り付けたいと思っています。 その場合に例えば画像を出力させる場合は <IMG src="cgi-local/top.cgi"> で指定し、 #!/usr/local/bin/perl print "Content-type: image/jpeg\n\n"; open FH,"<../image.jpg"; binmode FH; binmode STDOUT; print while(<FH>); close FH; をやれば動かせますが、これを画像ではなくhtmlを表示させるためには print "Content-type: image/jpeg\n\n"; を print "Content-type: text/html\n\n"; に変更する事により可能だと思いやってみたのですが、うまく出力できませんでした。 cgi処理をうまくhtmlに貼り付ける方法があるのでしょうか。どうか教えて頂けないでしょうか?お願します。(涙)

    • ベストアンサー
    • CGI
  • バイナリファイルのアップロードに関して

    今回質問させて頂くことに関連した問題を、現在MySQLのカテゴリで質問させていただいているのですが、 バイナリファイルをアップロードし、そのファイルのバイナリデータを変数($img)に格納し、それをDBに格納するという形を目指しています。しかし、DBにどうしても格納できません。もしやバイナリデータを変数に格納する時点で、既におかしいのかと思いまして、その部分についてこちらでご教授頂きたく書き込ませていただきました。 #!C:\Perl use CGI; use DBI; $PCMOJPATH='C:\パス名'; #ディレクトリ指定 my ($buffer); my $query = new CGI; $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; #ファイル名 print "Content-type: text/html\n\n"; print "<html><body>\n"; my $fH = $query->upload('filename'); my $mimetype = $query->uploadInfo($fH)->{'Content-Type'}; open (OUT, ">$PCMOJPATH/$newfile"); binmode (OUT); while(read($fH, $buffer, 1024)){ print OUT $buffer; $img .= $buffer;   #バイナリデータを$imgに格納 } close (OUT); close ($fH) if ($CGI::OS ne 'UNIX'); chmod (0666, "$PCMOJPATH/$newfile"); ------------------------- と書いているのですが、$imgにはバイナリデータがちゃんと入っていないのでしょうか?間違っているところがあれば、どのように直したらいいか教えてください。どうぞよろしくお願いします。

  • バイナリファイルの出力

    「test.dat」というファイルをブラウザから ダウロードさせるためにバイナリ出力をしたいのですが、 空ファイルばかりできて上手くいきません。 以下のようなコードなのですが、どこが悪いでしょうか? ご教授ください。お願いします。 症状:ブラウザからダウンロードすると、ファイル名は正しいが 空のファイルになっている 環境:perl 5.8.7 windows server2003 ----------------------------------------------------------- #!/usr/local/bin/perl print "Content-Disposition: attachment; filename=\"test.dat\"\n"; print "Content-Type: application/octet-stream\n\n"; open(IN, "test.dat"); binmode(IN); binmode(STDOUT); print while (<IN>); close(IN); -----------------------------------------------------------

    • ベストアンサー
    • Perl
  • サブスクリプトとのファイルハンドル受け渡し

    メインの実行スクリプトの中から、 サブのスクリプトを実行し その結果をメインから与えたファイルハンドルへ出力したいのですが、 うまくいきません。 尚、サブスクリプトは適当な(下記例ですと./sub/)以下に 複数あります。 MAIN.pl --------- my @subs = glob "./sub/*.pl" ; open OUT, "> tmp.txt" ; my $fh = *OUT ; foreach my $sub ( @subs ){ $sub $fh 引数1 引数2; #ここの書き方が特にわかりません } close OUT ; サブスクリプト --------- my $fh = $ARGV[0] ; my $A = $ARGV[1] ; my $B = $ARGV[2] ; print $fh "結果\n" ; ---------

    • ベストアンサー
    • Perl
  • 同時に二つのファイルにprintする方法

    普通print文は一つのファイルハンドルに出力しますが、それを二つのファイルハンドルに同時に同じ内容を出力する方法はありますか? sub print2 { my $str = shift; print FH1 $str; print FH2 $str; } とすれば一応二つのファイルハンドルに対して出力できますが、print文一つで簡単に済ませる方法があれば知りたいです。 IPC::Open2などがありますが、これは別の目的のものみたいですし・・・ よろしくお願いします。

  • 普通の html に cgi を使って画像を・・

    ソースお手本表を見ながら質問タイトルのようなことをやりたいと思いました。 結果はHTMLを実行すると通信が1分から3分ぐらい通信を行い、最後には画像を表示しないようなります。 どこがおかしいのかおしえていただけないでしょうか? どうかお願いします。 ------------------------------------------------ #!/usr/local/bin/perl #use DBI; print "Content-type: image/jpeg\n\n"; open FH,"<image.jpg"; binmode FH; binmode STDOUT; print while(FH); close FH; ------------------------------------------------

    • 締切済み
    • CGI
  • Perlでファイル出力時にデッドロック(?)してしまいます。

    Perl(5.005_03)で、約5000万バイトのテキストファイルを読み込んで、そのデータに変更を加えた後、別のテキストファイルに書き出すプログラムを作っています。 テキストファイルへの書き出しは、16回に分けて約300万バイトずつ行っています。 すると、ファイルへの書き出しが半分も終わらないうちに、デッドロック(?)してしまうみたいで、書き出し中のファイルは途中のまんま、プログラムが終わってしまいます。。。 いまは、出力ファイルを開く前に「print " ";」を入れることでとりあえず動いています。(それも、どうしてなのかわかりません・・・) 何か良い方法はないでしょうか? よろしくお願いします。 【環境】sun4-solaris, apache 以下は、ファイルへ書き出している部分のソースです ------------------------------------------------------------------- print " "; # これを入れないとプログラムが正常終了できません open OUT, ">>$file" || die "can't open : $!"; print OUT $data; # $data には約300万バイト入っています close OUT; -------------------------------------------------------------------

    • ベストアンサー
    • Perl
  • CGI経由でのPDFファイルをダウンロード

    こんにちは。 CGIの初心者です。 今CGI経由でのPDFファイルをダウンロードするというプログラムを作っています。 ただ、ダウンロードしたファイルは開けなく、エラーが出ます。ファイルを確認すると0バイトです。原因はよく分からないので、誰かが教えてください。ありがとうございます。 コードです: $filename = './data/sheet.pdf'; $source = $filename ; print qq|Content-type: text/plain\n|; print qq|Content-Disposition: attachment; filename="$filename"\n|; print qq|\n|; #-- ファイルを読み込んで出力 open(FILE,"$source"); binmode FILE; binmode STDOUT; while(read(FILE, $value, 4096)){ print $value; } close FILE;

    • 締切済み
    • CGI