ファイルオープンの挙動

このQ&Aのポイント
  • Windows環境とLinux環境でのファイルオープンの挙動に違いがある
  • Windows環境ではファイルの読み取りと書き込みがうまくできない
  • Linux環境ではファイルの読み取りと書き込みが正常に行われる
回答を見る
  • ベストアンサー

ファイルオープンの挙動

windows環境にてperlの勉強をしております。 http://www.rfs.co.jp/sitebuilder/perl/05/03.html#open を参考にopenを使っておりました。 ファイル書き込みがうまくできていないようなので 以下のようなテストプログラムを作成したのですが 上記のサイトのような挙動をしませんでした。 --source--- #!/usr/local/bin/perl print "Content-type: text/html\n\n"; open(FILE, "+> sample.txt"); $data = <FILE>; print "data = $data<br>"; $flag = print FILE "TEST MESSAGE"; print "flag=$flag<br>"; close(FILE); --source-- --sample.txt-- 実験です --sample.txt-- windows環境だと data = flag= と表示され linux環境(レンタルサーバ)だと data = flag=1 と表示されます。 私の予想では data = 実験です flag = 1 と表示されると思ったのですが何が原因でしょうか。 またlinuxとwindowsで結果が違うのは何か原因があり、 また修正可能でしょうか。 openに+>の挙動例が書いていないサイトもあることが 若干気になります。 もし+>自体が不安定なのでしたら安定して使えるもの をおしえてください。所望の挙動は読み取り+上書き書き込みです。 環境 windows2000 "an http daemon" linux (infoseekフリースペース) apache

noname#6323
noname#6323
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Ethersky
  • ベストアンサー率71% (168/235)
回答No.1

+> は、入出力共用ではありますが上書き用途です。 既にファイルが存在した場合、+> で開いた時点で0バイトのファイルになります。 +> は、「書いてから読む」向けです。 serchさんが希望する動作をさせるには +< を使います。 が、その場合以下のように書いたのでは正しく動作しません。(なお、ここではHTMLではなくプレーンテキストで吐かせてます) print "Content-type: text/plain\n\n"; open(FILE, "+< sample.txt"); $data = <FILE>; print "data = $data\n"; $flag = print FILE "TEST MESSAGE"; print "flag = $flag\n"; close(FILE); この状態だと、最終的なsample.txtの中身は以下のようになります。 実験ですTEST MESSAGE つまり、元から入っていた「実験です」の続きに「TEST MESSAGE」が入ります。 そこで以下のようにします。 print "Content-type: text/plain\n\n"; open(FILE, "+< sample.txt"); $data = <FILE>; print "data = $data\n"; truncate(FILE,0); #ファイルを0バイトに切り詰め seek(FILE,0,0); #読み書きのポインタ位置をファイルの先頭に $flag = print FILE "TEST MESSAGE"; print "flag = $flag\n"; close(FILE); truncateでファイルサイズを0バイト(空)にし、seekで書き込む位置を先頭に戻してこれで予想通りの動作ができます。 但し、+< は「読んでから書く」のごとくopenする時点でファイルそのものが存在しないとエラーとなります。

noname#6323
質問者

お礼

確認できました。 迅速かつ的確なアドバイスでした。 参考にいたします。ありがとうございました。

関連するQ&A

  • tsvファイルの読み込みエラー

    ファイル読み込み後、内容表示するプログラムをつくったのですが、tsvファイルを読み込むとWEB画面には何も表示されず真っ白になってしまいます(普通のtxtファイルでもタブが入っていると表示しません)。tsv読み込み時は何か設定が必要なのでしょうか? #!/usr/local/bin/perl print "Content-Type: text/html\n\n"; print "<html>\n"; print "<head><title>サンプル</title></head>\n"; print "<body>\n"; if (open(FH, "data/block.txt")) { @file = <FH>; close(FH); print "<p>ファイルの内容は、<br>\n"; foreach $data (@file) { print "$data<br>"; } print "です。</p>\n"; } else { print "ファイルを読み込めません。"; } print "</body>\n"; print "</html>\n"; exit;

  • STDINの挙動がよく分かりません

    POST形式で読み込んだデータを3通りで書きだしてみました。しかしながら1番最初のファイルにしかデータは書き出されていません。 ひょっとしてSTDINはコンピュータがアクセスしてきた時の行を覚えていて、次のアクセスがあった時はそこから処理が行われるのでしょうか。それなら1度ファイルに全ての入力データを書き出した際にアクセスポイントはファイルの最後になっているから、2度目、3度目の書き出しの際はループが廻るはずがありません。 そこで書き出しまえに$-を書き出してみました。でも1度目のループを行う前から値は0。 前にファイルハンドル名など何かを付けなくては$-は死んでいるのかと思って、$=を書き出してみると60という値を取ります。でも書き出された1度目のループのファイルを数えてみると$=80なんです。何なんでしょう、この60という値は。 どうもSTDINの挙動が分からないのですが、どういう理由でこうなっているのか。どうしたら3回ループを廻すことが出来るのかご教授いただけないでしょうか。 ********************************************** #!/usr/bin/perl -d use CGI; use SR; open(OUT,'>stdin_main.txt'); print OUT $-."\n"; print OUT $=."\n"; while(<STDIN>) { print OUT $_; } close(OUT); &SR::parse_form; our $q=new CGI; print $q->header(-charset=>'utf-8'), $q->start_html(-charset=>'utf-8', -lang=>'ja-JP'), $-,"<br />\n", $=,"<br />\n"; while(<STDIN>) { print $_; } print $q->end_html; ********************************************** package SR; sub parse_form { open(OUT,'>stdin_SR.txt'); print OUT $-."\n"; print OUT $=."\n"; while(<STDIN>) { print OUT $_; } close(OUT); } 1;

    • ベストアンサー
    • Perl
  • perlのopen()で+<を使用した時の挙動が変

    open()で+<を使用すると読み書き両方ができると 理解しましたが、書き込んだ後の結果が 私が思っていた挙動と違っていました。 例えば、 ---test.pl-------------------------- open(FILE,'+<test.txt') or die "$!"; my $line=<FILE>; print FILE "ABC\n"; close(FILE); ---test.txt---- 123 456 789 --------------- を実行すると ---test.txt---- 123 ABC 789 --------------- となることを期待していましたが実際には ---test.txt---- 123 456 789 123 ABC ---------------- となっていました。 1行だけ読み出したときのファイルポインタ は2行目の先頭を指しているように思われますが なぜこのような結果になるのでしょうか。 (Windows7,ActivePerl)

    • ベストアンサー
    • Perl
  • open関数のファイル操作について

    プログラミング経験ゼロで、CGI及びPerlを勉強しだした者です。 初歩的な質問で恐縮ですが、おわかりになる方ご教授願えますか。 open (ANSWER, ">>data.txt"); print ANSWER "$jikan,$data?n"; close (ANSWER); open関数の箇所を上の様に書いたのですが、自動生成されるはずのdata.txtファイルが見当たりません(CGI-Executablesフォルダ内) ではということで、data.txtファイルを作ってCGI-Executablesフォルダ内に置いてみたのですが、そちらにも書込みされませんでした。 ブラウザではフォーム入力の次に用意した「出力完了」のページに切り替わるのですが、やはり出力はされていないということでしょうか。 どのように修正すれば良いのか困ってます。よろしくお願いします。

    • ベストアンサー
    • Mac
  • 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
  • open (FILEHANDLE,"< $filename") or die "エラーメッセージ";について

    下記プログラムでperl_read_writes.txtを出力すると、中身が表示されるのですが、a_perl_read_writes.txt等に名前を変更すると、当然エラーが起きます。 が、die "$filenameを開けません。";の部分の $filenameを開けません。という文章が出力されないのですが、どなたか原因分かりませんか? ================================================== #!/usr/bin/perl print "Content-type: text/html;charset=Shift-JIS", "\n\n"; # HTMLの出力 print "<html>\n"; print "<body>\n"; print "ファイルの読み書き<br>\n"; $filename='/usr/local/apache/htdocs/aaa/bbb/perl_read_writes.txt'; # ファイルオープン open (FILEHANDLE,"< $filename") or die "$filenameを開けません。"; ...以下省略 ================================================== よろしくお願いします。

    • ベストアンサー
    • Perl
  • CGIでファイルが読み込めない

    CGI初心者です。 (osはlinuxです。) #!/usr/local/bin/perl use strict; use CGI; my $file=new CGI; open(DATA,"/home/data.txt"); $file=<DATA>; close=(DATA); print "Content-type: text/html\n\n"; print "data=$file"; このスクリプトで、/home/data.txt(フルパスです)に書かれているデータを1行だけをブラウザで表示させたいのですが、表示できません。 どこがおかしいのか教えてください。 ちなみにdata.txtには実際に「abc」という文字1行しか入れていません。

    • 締切済み
    • CGI
  • TSVファイルを読み込んで表示したい

    $file="sample.txt"; // 変換対象TSVファイル $fpw = fopen($file,'r'); while (!feof($fpw)) {   $data = fgets($fpw));   $line = explode("\t", $data);   print "line= ".$line[0]."<br>";   print "line= ".$line[1]."<br>"; } としましたがうまく内容が表示されません。 どのようにしたら良いでしょうか?

    • ベストアンサー
    • PHP
  • perl ファイルのデータを編集したい

    初めまして、perl をやり初めたばかりです。作業は Linux 上で行ってます。 あるテキストファイル data.txt があります。 data.txt の中は、以下のようになっているとします。 100 200 300 400 500 600 これを読み込んで、例えば、 1 2 3 4 5 6 以上の様に各数字を百分の一にして出力したいと思ってます。 一応、色々と調べながらプログラムを書いてはみましたが 思う様に出力されません。以下そのプログラム。 #!/usr/bin/perl open(IN, "data.txt") or die ; @x = <IN>; close (IN); $ref_x = \@x; $n_data = @x; for ($i = 0; $i< $n_data; ++$i) { $$ref_x[$i] /= 100 ; print $x[$i], " "; } print"\n"; どなたか、perl にお詳しい方教えていただけないでしょうか? 宜しくお願い申し上げます。

  • ファイルの3行目までを出力したい

    Perl初心者です。 test.txtというファイルがあって、その中の1行目から3行目までを 出力したい場合はどうしたらいいでしょうか? open(FILE,"test.txt") || die "Open Error.\n"; @data = <FILE>; close(FILE); foreach (@data) { print $_; } これだと、ファイルの中身が全て出力されてしまいます。

    • ベストアンサー
    • Perl

専門家に質問してみよう