• ベストアンサー
  • 暇なときにでも

ファイルopenについて

1----------------------------------- open(IN,">$past_file")|| &error; @lines2=<IN>; close(IN); >は書き込みopenということですが、この使い方で一応読み込みはできます。しかしやはり使い方としては間違っているのでしょうか?OSによってはできないとか・・ というのも、ないファイルをOPENするとき、読み込みではファイルはopenできませんよね。書き込みでopenすれば、ないファイルを自動で作成してくれます。今作っている掲示板だとこれは都合がいいので、こういう風に記述したいのですがだめでしょうか。

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数44
  • ありがとう数0

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

  • ベストアンサー
  • 回答No.3
  • tatsu99
  • ベストアンサー率52% (391/751)

#1です。 open FILE, "+>$data"; を指定した場合は、 読み書き用のオープンとなります。 なおかつ、ファイルが存在しない場合は、新規作成します。 既に、ファイルが存在する場合は、そのファイルの内容は切り捨てられます。 下記のURLを参照ください。

参考URL:
http://www.rfs.jp/sitebuilder/perl/05/03.html#open

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 掲示板の文字色指定について

    はじめまして。私は学生で超のつく初心者なのですが、課題で掲示板を作っています。 基本的な表示はなんとかうまくいったのですが、よくある、文字色を選択して好きな色で文章(コメント)を表示させるプログラムがわかりません。 if文を使うパターンではなく、色の情報を書き込み、ファイルからデータを読み込むやり方でできるらしいのですが、どうやって書いたらよいのでしょうか・・・。 ちなみにhtml表示部分に、色の指定はしてあり、赤、青、緑、黄色でvalueはred,blue,green,yellowにしています。 下に書き込みと読み込みの部分を乗せたのですがどう入れたらいいでしょうか。 本当に初心者だし分かっていないので説明もわかりにくくてすいません。もしどなたか分かる方いたらよろしくお願いします。 #------------------------------------------------------------ # 登録データ書き込み処理 #------------------------------------------------------------ sub writeData() { # $DATAFILEをオープンする open(FILE, ">> $DATAFILE") or die("error:$DATAFILE open error!"); eval{ flock(FILE, 2); }; $timestr = &getTimestr(); $in{'comment'} =~ s/\n/<br>/g; print FILE "$in{'namae'},$in{'dai'},$in{'comment'},$timestr,"; close(FILE); } #------------------------------------------------------------ # 登録データ読込み処理 #------------------------------------------------------------ sub readData() { # $DATAFILEをオープンする open(FILE, "< $DATAFILE"); eval{ flock(FILE, 2); }; while(<FILE>){ chomp; $line[$cnt++] = $_; } close(FILE); }

    • ベストアンサー
    • CGI
  • open中のファイルをrename

    オープン中のファイルをflockによる排他をしたままrenameしたいのですがどうもうまくいきません。 sysopen(LOCK, "$file", O_WRONLY);   もしくは open(LOCK, "> $file"); flock(LOCK, 2); rename($tempfile,$file); close; close前にrenameするとロックが外れてしまいます。 close後にrenameをするとやはりロックが外れた状態でのrenameになります。 renameするファイル以外にflock専用ファイルを固定で一つ用意すれば簡単なのですが openしたいファイル数は相当な数があり、各ファイルごとにロックをかけたいのです。 全ファイル分のflock専用ファイルを用意するか、排他方式をmkdirにする以外 何か良い手立てはございますでしょうか。

  • perlでの別ファイルへの出力について

    perlでファイルAから読み出した値を別ファイルBに出力させたいです。 イメージとしては -------------------------------- open(FILE,ファイルA); while(<FILE>){ my $line = "$_"; system("ls -l $line"); #←ここの結果を1行ずつファイルBに出力したい } close(FILE) --------------------------------- 上記の場合どのように記述すれば良いのでしょうか? bashでは簡単にかけるのですが、 業務上perlを使用する必要がある為こまっております…。

    • ベストアンサー
    • Perl

その他の回答 (4)

  • 回答No.5

natsuki_tkさん(#2)も > 事前にファイルの存在を調べて、... とおっしゃっていますが、 if (-e $past_file) { # もし$past_fileがあったら   open IN, $past_file or &error;   @line2 = <IN>;   close IN; } じゃダメですか?

共感・感謝の気持ちを伝えよう!

  • 回答No.4

誤解招いてしまったかもしれないので一応補足を。 >はファイル内容を開く際に消します(無ければ新規作成) +はファイル読込可に +>は、理論上読みこみもできます。 が、ファイル自体消した上で空白を読んでも仕方ないので 自分が書き込んだものを読み戻す場合が主な用途でしょう (一般的に使う機会ほとんど無いと思いますが) その意味で、最初の質問のソースの代わりには使えません。

共感・感謝の気持ちを伝えよう!

  • 回答No.2

">"では読み込めません。 ">"はファイルを開く際に中身が消去されます。 ですので、基本的に読み出し用には使えません。 open FILE, "+>$data"; の場合も同様です。 (下記+<のタイプミスかと思います) (ちなみに、書き出したものを再度読み込む場合に使うものです) 更新を前提とした読み込みの場合は、 open FILE, "+<$data"; を使うのが一般的です。 (ロックをかける際にもシンプルに済みますし) 残念ながらファイルが無い場合には作成してくれませんけれど。 ファイルを作成もしたい場合は、 事前にファイルの存在を調べて、 無ければ作成といったようにわけるのが早い気がします。 #sysopenという選択肢もあります。

共感・感謝の気持ちを伝えよう!

  • 回答No.1
  • tatsu99
  • ベストアンサー率52% (391/751)

Windows上で確認した結果では、読み込めませんでした。 そのような場合通常は、 open(IN,"+>$past_file")|| &error; のように、>の前に+をつけて読み書き用にしてオープンします。上記のようにした場合は、ファイルの内容を読み込むことが、可能です。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • CGIROOMさんのデータベース機能について、管理者と連絡取りたい

    CGIROOMさんのデータベース機能について、管理者と連絡取りたい。 また、簡易高機能検索専用データベース ソート版(http://cgiroom.nu/list/database/database2s/)と、database.cgi用 データエディタ(http://cgiroom.nu/list/database/dataedit/index.htm)を併用して利用しているのですが、データファイルの容量が300k以上になると、エラーが表示されてしまうのですが、これを解除する方法をどなたか教えていただけませんか? ソースデータ if($FORM{'cmd'} eq "edit" && $FORM{'line'}){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); if($FORM{'write'}){ &error('行指定が不正です') if $FORM{'line'} =~ /\D/; $data[$FORM{'line'} - 1] = join("\t",@line[1..$#line],"\n"); open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT @data; close(OUT); &msg('更新しました'); } @data = split(/\t/,"\t".$data[$FORM{'line'} - 1]); &error('指定されたデータは存在しません') unless @data; open(HTML,$FORM)||&error('フォームファイルを開けません'); read(HTML,$html,-s HTML); close(HTML); $html =~ s/__(cmd|line)__/$FORM{$1}/g; $html =~ s/__data(\d+)([a-zA-Z]*)__/&tag($data[$1],$2)/eg; &html(\$html); }elsif($FORM{'cmd'} eq "new"){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; if($FORM{'write'}){ if($unshift){ open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT join("\t",@line[1..$#line],"\n"),@data; close(OUT); }else{ open(OUT,">>".$FILE)|| &error('データファイルを更新できません'); print OUT join("\t",@line[1..$#line],"\n"); close(OUT); } &msg('データを追加しました'); } open(HTML,$FORM)||&error('フォームファイルを開けません'); read(HTML,$html,-s HTML); close(HTML); $html =~ s/__cmd__/$FORM{'cmd'}/g; $html =~ s/__data\d+[a-zA-Z]*__//g; &html(\$html); }elsif($FORM{'cmd'} eq "delete" && $FORM{'line'}){ &error('300k以上あるデータは修正できません') if -s $FILE > 01234567; &error('行指定が不正です') if $FORM{'line'} =~ /\D/; open(IN,$FILE) || &error('データファイルを開けません'); @data = <IN>; close(IN); &error('指定されたデータは存在しません') unless $data[$FORM{'line'} - 1]; undef $data[$FORM{'line'} - 1]; open(OUT,">".$FILE)|| &error('データファイルを更新できません'); print OUT @data; close(OUT); &msg('指定されたデータを削除しました'); } どこを修正すればいいのでしょうか?

  • cgiでhtmlファイルを読み込みたい

    cgiでhtmlファイルを読み込み、状況に応じてcgiで内容の修正や追加をして表示させたいのですがどうしても元ファイルを読み込めません。 IN = "○○.html"; $line = open(IN, "r"); とか $line = opne IN, "○○.html"; それに $line = "○○.html"; open(IN, $line); @line = <IN>; など調べて出てきたもの一通りやってみたのですが、どうしても読み込みができません。 どうすればファイルの読み込みができるのでしょうか。 仕事でどうしてもやらなければならないので、ご存じの方お助けください。

    • ベストアンサー
    • CGI
  • Perlでファイル書き込みの際の不思議

    WEB上でPerlCGIを稼働し、ファイル(file.dat)からデータを読み込み、 @line=(0001,0002,0003) とします。 このときファイルの中身は 0001 0002 0003 という風に改行されています。 そして、@lineをいろいろ操作し、最終的に @newline=(0001,0003) とし、 (実際には各要素には改行がついています) これを open(OUT,">file.dat") print OUT @newline; close (OUT); と言う風に書き込み処理しました。 すると、ファイルの中身はなぜか 0001 0003 0001 0002 0003 もしくは 0001 0003 00001 0001 0002 0003 となってしまいます。(この違いはいろいろ試しているうちに発生しました) もちろん上書きオープンです。 試しに @newline を空にして書き込むとファイルは空になりました。 どう試してみても、新しいデータと古いデータが書き込まれてしまうのです。 場合によっては心当たりの無いデータまで・・・ 書き込みの前後で@newlineを画面表示してみましたが、 書き込みの前も後も問題なく表示されています。 つまり、書き込まれたデータだけが異常なのです。 今まで、データの更新→書き込み というのを いろいろやってきましたが、このような現象は初めてです。 原因として考えられることを教えてください。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • 外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカ

    外部ファイルの読み込みにrequireを利用し、指定ファイルパスをスカラー変数で行うとエラーとなる ファイルには、外部実行の格納ファイル名が入っています。 処理をしたいことは、指定ファイルにある変数を利用して、外部ファイルを実行することです。 実行すると以下のエラーを出しています。 ------------------------------------------------------------------ Software error: Can't locate ./$cfl/puls.cgi in @INC ...略 ------------------------------------------------------------------ プログラムは以下の内容です。 ------------------------------------------------------------------ 省略 open(DATA,"$file")|| die &error(" $file を読み込みopen出来ません"); flock(DATA,1); @lines = <DATA>; foreach $line(@lines){ ($afl,$bfl,$cfl,$efl,$y3) = split("<>", $lines1); require './$efl/puls.cgi'; } close(DATA); 省略 ------------------------------------------------------------------ そもそもrequireでスカラー変数が使えないのか? そのあたりも調べてみたのですが分かりませんでした。 また今回の方法以外にやり方がございましたらご指導頂きたく書き込みいたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルの3行目までを出力したい

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

    • ベストアンサー
    • Perl
  • ディレクトリ全てのファイルを読み取るには?

    フリーのCGI掲示板を使ってます。ディレクトリ内に複数のログファイルがあるので、一括して編集・削除ができるように管理部分を改造したいのでアドバイスをお願いします。 一応、readdir関数でディレクトリ内にある全てのファイル名を取得でることは分かりましたが、open関数で全てのファイルを読み取らせる方法がわかりません。 open DIR "./log"; @files = readdir DIR; close DIR; #以下、オリジナルのソースです。 open(IN,"$logfile") || &error("Open Error: $logfile"); while (<IN>) { my ($no,$dat,$nam,$eml,$sub,$com,$url,$hos) = split(/<>/); #途中略 } close(IN);

    • ベストアンサー
    • Perl
  • ファイルの書き込み2

    またまた失礼します。 やりたいことは以下です。 1.ディレクトリを開く。 2.ファイル達を読み込み。 3.追記用のデータファイルを開く。 4.「2」にデータを追記 5.別のディレクトリに書き出し。 以上です。 4番がうまくいきません。 ためしに4の工程を抜かすと問題なく書き出されます。 4の工程でやりたいことは、 1.タブ区切りのテキストファイルを読み込み。 2.書き出し用に読み込んだ(追記したいファイル)<productのpath="[ココの値!]"を取得。 3.「2」番で取得した値と「1」番で取得した値を比較。 4.「3」がtrueの行を追記して書き出し。 以上。 要するになにがしたいかというと、 仮にタブ区切りテキストには10行分のデータがあるとします。 それぞれの行には3つ分の値が入っており、先頭にIDが付いています。 一番最初に読み込んだファイル(追記したいファイル)にも同様にIDが振られており(<product path="ココ")そのIDとタブ区切りテキストのIDが一致した行だけ追記したいということです。 下記のコードだとなぜか、 10行分のデータがすべて追記されてしまいます。 コードは以下です。 #!/usr/bin/perl #既存ファイル読み込み&追記 $n_dir = "newXml/"; $b_dir = "xml/"; opendir(DIR, $b_dir); while($file = readdir(DIR)){ $bfile="$b_dir$file"; $nfile="$n_dir$file"; $dfile="data/data.txt"; if (-T $bfile) { open(IN, $bfile);#既存ファイルオープン @list = <IN>; close(IN); open(OUT,">$nfile");#書き出しファイルオープン foreach $line (@list) { if ($line =~ /\<product/){ $line =~ /path=\".*\"/;#path取得 $1; } if ($line =~ /\<\/product\>/) { open(IN, $dfile);#追加データファイルオープン while($data = <IN>){ chomp(@data = split(/\t/,$data)); $data[0] =~ s/\//_/g; if($data[0] == $1){#取得したパスとdata.txtとってきた値を比較 print OUT <<EOF; <ds path="$data[0]">$data[1]</ds> <kw>$data[2]</kw> $line EOF } else{next;} } close(IN) }else{print OUT $line;} } close(OUT); } else{next;} } closedir(DIR); 長々と申し訳ありません。 エラーなどは特にありません。 ご協力お願いします。

    • ベストアンサー
    • Perl
  • flockについて

    http://www.freespace.jp/phpstudy.php4 のサイト様を拝見したり、フリーで配布されているスクリプトを見ると、書き込むファイルに対して、 $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … とやっていると思うのですが、perl記述のcgiで掲示板を作成したときは、書き込むファイルとは別にロック用のファイルを用意し、(perl記述です) open(LOCK,"+<$lockfile"); flock(LOCK,2); open(IN,"$logfile"); .... close(IN,"$logfile"); open(OUT,"$logfile"); .... close(OUT,">$logfile"); としていました。(書き込むファイルが2つあったのでこのような方法をとってました) そこでphpでも同じ方法は使えるのでしょうか? $fp = fopen('bbs.log', 'r+'); flock($fp, LOCK_EX); … の方法を使おうと思っていたのですが、最初にログファイルを読み込むとき、 file("bbs.log"); という風にしているので、flockに記述すべきファイルハンドルが見当たりません。仮に取得できたとしても、file();の仕様からして内部にcloseが入ってそうなので、flockできたとしてもcloseで無効になってしまわないかが心配です。なのでこの場合はやはり別にログファイルを用意しないとできないということでしょうか。

    • ベストアンサー
    • PHP
  • 一つのテキストファイルと複数のファイルの結合

    よろしくお願いします.ディレクトリ内の一つのテキストファイル(joint.txt)と複数のファイルの結合を行ごとに隣へ結合するプログラムを作成しています.ここで以下のプログラムを作成したのですが,うまくいかないため,誤っている部分をご指摘願えないでしょうか. my $dirname = '.'; opendir(DIR, $dirname) or die "$dirname: $!"; while (my $dir = readdir(DIR)) { next unless (-f $dir); next unless ($dir =~ /\.txt$/); open(FILE, $dir) or die "$dir: $!"; open(FILE2,"joint.txt"); my @file = <FILE>; my @file2 = <FILE2>; close(FILE); close(FILE2); foreach my $line (@file) { foreach my $line2 (@file2) { chomp $line2; $line = "$line2.",".$line"; } } open(NEWFILE, "> $dir") or die "$dir: $!"; print NEWFILE @file; print NEWFILE @file2; close(NEWFILE); } closedir(DIR);

    • ベストアンサー
    • Perl
  • UNIX上でのファイルopenについて

    C言語で同一ディレクトリから複数のファイルを順番に読み込んでいきたいのですが、うまくいきません。 シェルで、ファイル名の取得を行っていっています。 shell ---- ls /home/data > /home/src/infile.txt ---- C ----------------------------- FILE *fp; char y[30]="/home/data/"; // ↓aには上記シェルにて取得した1件目のファイル名が入っています。 strcat(y,a); // ↓ここでは絶対パスが正しく表示されます printf("ddd:%s\n",y); // ddd:/home/data/11.txt // ↓ここでfile open errorで一件目で終了してしまいます。 if ((fp = fopen(y,"r")) == NULL){ printf("file open error!!\n"); exit(1); } ----------------------------- このようなファイルの読込みのやり方ができるのか教えてください。 もしできるのであるのなら、そのやり方も教えてください。 わかりにくい文章ですが、お願いします。