• ベストアンサー

EOFの書き込み Perl

CGI初心者です。質問させてもらいます。 テキストファイルを読み書きモードでオープンします。 open(FILE, "+<test.txt"); 読み込みや書き込み作業をした後、 現在のファイルポインタの位置や、 seek FILE, 0, 0; などファイルの先頭で、 EOFを書き込めないのでしょうか? 例)print FILE 'EOFの文字'; Cでは出来たような気がしましたが・・ ファイルポインタの位置でファイルを終わらせる 簡単な方法ありましたら、お教え願います。m(__)m

  • CGI
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

tell で現在位置を調べて、truncateでファイルサイズカット。

参考URL:
http://www.presso.jp/text/perl/file.html
syogayaki
質問者

お礼

ファイルサイズカット何とかできました。 かなりの勉強不足でした。 ありがとうございました。m(__)m

関連するQ&A

  • perlについて、教えてください。

    perlについて、教えてください。 「apple.html」と「bigin.html」に、それぞれ, textboxが一つあり、入力値をkeep.cgiで受取り、 「keep.txt」に書込もうと考えています。 a.htmlのテキストボックスに、入力して、submitボタンをクリック しても、「keep.txt」に何も書き込まれません。 「keep.txt」に、 _______ a=100 b=200 ________ のように、書込みたいと考えています。 下記、keep.cgiのどこが間違っているのか、教えてください。 ___以下、「keep.cgi」です。_______________________________ #! c:/perl/bin/perl if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } #$queryに「●_text=●」が入っている。 #ファイルを開く、読み書き用。 $open_file_name = "+<keep.txt"; open(A,$open_file_name); #開いたファイルを、1行ずつ読み込む。 while(<A>){ #$_には、keep.txtの、1行目が入っている。 #$_(読込んだ行)に「●_text」があるか、チェックする if($_ =~ /$query/){ #あった場合 next; } #読込んだ行に、$query以外なら、配列に。 @keep = $_; @keep = $query } #ファイルを閉じる。 close(A); #ファイルを削除する unlink($open_file_name); #削除したのと、同じファイル名で新規作成 $new_file = ">>keep.txt"; open(A,$new_file); #再度、作成したファイルに、配列@keepを書込む。 print A @keep; #ファイルを閉じる close(A); print "Cotent-type:text/html\pirnt n\n"; print <<EOF; <body bgcolor="pink"> <font size="4"> 入力値をファイルに書込みました。<br> </font> EOF exit; ______________________ 宜しくお願いします。

    • ベストアンサー
    • CGI
  • fwriteで書き込み

    やりたいことは・・・下に書いていきます。 何がおかしいのか教えてください。 $fp = fopen("example.txt", "r+"); fopenでexample.txtを読み書き可能で開きます。 返り値はポインタですよね。 $fseek = fseek($fp, -3, SEEK_END); $fpで開いたexample.txtのポインタを、ファイルの最後尾から3バイト戻したつもりです。 返り値は 0 成功 -1 失敗 $ftell = ftell($fp); で、今のポインタの位置を確認します。 返り値はポインタ。 fwrite($ftell,$write); $writeの内容を、example.txtの最後から3バイト戻ったところへ書き込み・・・のつもりなのですが。 専門分野ではありませんので、調べてもなかなか進まないです。 ご教授お願いします。

    • ベストアンサー
    • PHP
  • 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
  • perlでファイルへの書き込みができません!

    perlでファイルへの書き込みができません! 教えてください. webプログラミング初心者なのですが, フォームから送信されたデータをshift-jisに変換させてからbbs1.txtへの内容の書き出しを行いたいのですが, #!/Applications/XAMPP/xamppfiles/bin/perl print "Content-type: text/html; charset=utf-8\n\n"; # フォーム部分を表示する print <<EOL; <html> <body> <h2>一行掲示板</h2> <form method="post" action="bbs1.cgi"> メッセージ:<input type="text" name="message" size="60"> <input type="submit" value="送信"> </form> <hr> EOL &ReadParse(*form); # フォームの値を取得 $message = $form{"message"}; use Encode; use Encode::Guess qw(euc-jp shiftjis 7bit-jis); encode("shiftjis",decode('Guess',$message)); # ログファイル読み込み open(IN, "bbs1.txt"); @log = <IN>; close(IN); # メッセージが入力されているときは書き込み処理を行なう if ($message ne "") { # ログ先頭にメッセージを格納 unshift @log, "$message\n"; # ログファイルに書き込み open(OUT, "> bbs1.txt"); print OUT @log; close(OUT); } # ログ表示 foreach $data (@log) { chop $data; print "$data<br>\n"; } print "</body>\n</html>\n"; このような感じにし実行して後でtxtファイルを見ると何も書かれていません>< なぜでしょうか...? 教えて下さい>< 今気づいたのですがそれに関連してなのかログも表示されていませんでした...>< txtファイルのアクセス権は読み書き可になっています encodeはあえてつかっています.

    • ベストアンサー
    • Perl
  • Perl 書き込み行の順番、読み込み

    #!/usr/bin/perl require "cgi-lib.pl"; print "Content-type: text/html\n\n"; ############ 書き込み ############# $file = "sample.txt"; print qq! <font size="1">コード入力<form method=POST action="./houkoku.cgi"> <input type="text" name="rank"> <br><br> <input type="submit" value="送信"> </form>!; use CGI; $query = CGI->new; $rank = $query->param('rank'); open( WRITE, ">> $file" ); print WRITE"$rank\n"; close ( WRITE ); ############ 読み込み ############# print "<table border=1>"; open( READ, "<$file" ); $adam = <READ>; while( $adam = <READ> ) { chomp ( $adam ); @column = split(",",$adam); print "<tr><td>@column[0]</td></tr>"; } close(READ); __END__ のようにして、送信されたものを表示していくようにしたいのですが、 新しい書き込みが下段に追加されてい行きます。 新しいものを上段へ表示したいのですが、 どのようにしたら良いでしょうか? sample.txtにも、新しいものが下に記入されています。 上段への書き込みのやりかたをご教授いただけたらと思います。、 よろしくお願いします。

    • ベストアンサー
    • Perl
  • perl seek関数について

    seek関数について少し質問させてください。 seek ファイルハンドル,オフセット,基準位置 と、某書籍に書いてありましたが、 オフセットのほうが元の位置で、基準位置が ファイルポインタを移動させる場所なんでしょうか? 例えば、 seek LOCK,0,2 の場合、ファイルハンドルLOCKの中のファイルポインタを0(ファイルの先頭)から2(ファイルの最後)に移動させるということでしょうか? そうであるならば、 seek LOCK,0,0 の場合、どういう意味になるのでしょう? 要点をまとめますと、ファイルハンドル以後の二つの数値の関係が今ひとつつかめていないということになります。 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • テキストファイルの読み込みとファイルポインタについて質問です。

    テキストファイルの読み込みとファイルポインタについて質問です。 最近PHPを勉強し始めました。 fgets()とfseek()についてわからないことがあるので教えて頂けないでしょうか。 現状以下のテキストとPHPファイルを用意しています。 PHPに2行目のbを表示させたいのですが、思ったように表示をさせることができません。 fgets()は"現在のファイルポインタから次の1行を取得" fseek()は"ファイルポインタを指定したバイト数分移動する"と調べてわかりました。 この二つを使って2行目を指定してbを表示したいのですがうまく表示されて困っています。 test.phpのコメントの★の部分がわからない箇所になります。 おそらく根本的な考え方が間違っていると思うのですが…いろいろ調べたのですがわかりませんでした。 申し訳ありませんがご教授願えないでしょうか。 ----------------- new.txt ----------------- a b c d e ----------------- ----------------- test.php ----------------- <?PHP $new_file = 'new.txt'; $fpt = fopen($new_file,'r'); // ファイルオープン直後のポインタ位置 echo '現在の位置=行指定'.ftell($fpt).'<br>'; print fgets($fpt).'<br>'; // ポインタを5進める fseek($fpt,5); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポインタの位置確認 print fgets($fpt).'<br>'; // ★ここでeを表示したい // 現在の位置からポインタを3戻す fseek($fpt,-3,SEEK_CUR); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★行指定が5-3なので2に…ならないです。 print fgets($fpt).'<br>'; // ポインタを先頭へ rewind($fpt); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ポイントが先頭にきたか確認 print fgets($fpt).'<br>'; // ポインタを最後へ fseek($fpt,0,SEEK_END); echo '現在の位置=行指定'.ftell($fpt).'<br>'; // ★new.txtはabcdeの5行なので5になると思いきや18に… print fgets($fpt).'<br>'; fclose($fpt); // ファイルを閉じる ?> ----------------- ----------------- 実行結果 ----------------- 現在の位置=行指定0 a 現在の位置=行指定5 現在の位置=行指定3 b 現在の位置=行指定0 a 現在の位置=行指定18

    • ベストアンサー
    • PHP
  • Perlのtruncateについて

    + test.txt 0 1 2 3 + main.cgi open(FH, "+<test.txt"); my @Log = <FH>; truncate(FH, 0); seek($FileHandle, 0, 0); print(FH "4"); close(FH); これで、main.cgiを実行すると、test.txtの中身は 4 1 2 3 となってしまいます。truncateがきいてないようなのですが、なぜでしょうか。 truncate(FH, 0) or die "error"; とすると、errorと表示されてしまいます。 なぜこうなるのでしょうか。 致命的エラーがでるわけでもないので、環境が悪いわけではないような気がするのですが。 flockをしたいのですが、他にファイルの中身を空にする方法とかありませんか。

    • ベストアンサー
    • Perl
  • テキストカウンターができない詳しい人教えて!

    #!/usr/bin/perl # 読み書きモードでファイルオープン # オープンできないときは強制終了 open(COUNT, "+<countdata") || die "File 'countdata' Open Error."; # ファイルをロックする #flock(COUNT,2); # ファイルから一行読みこむ $counter = <COUNT>; # カウントアップ $counter_new = $counter + 1; # ファイルポインタを先頭に戻す seek(COUNT, 0, 0); # ファイルに出力=書き込み print COUNT "$counter_new?n"; # ファイルクローズ close(COUNT); # ファイルロックを解除する #flock(COUNT,8); # ------- 出力はここから ------- # print "Content-type: text/html?n?n"; print << "END_OF_HTML"; <HTML> <BODY> <CENTER> <FONT size="6"><B> ようこそ<BR> あなたは<FONT color="red"> $counter_new </FONT>人目のお客様です </B></FONT> </CENTER> </BODY> </HTML> END_OF_HTML をcounter.cgiに保存してcountdataに0と打ち込んでwebサーバーにアップしましたが500エラーで見れません CGIの本通りに行いましたができませんサポートページもなく困っています ソースミスなどここが違うなどあったら教えて下さい あとパーミッションなども御願いします

    • ベストアンサー
    • CGI
  • Perl 先頭行に追加

    恐れ入ります。 Perlで、配列がカンマで区切られたデータを読み込み、 その先頭行にデータを挿入したいのですが、 中々うまくいきません。 データ(/data/xxx.txt)の中身は、 test,test2 bbb,bbb2 ccc,ccc2 という感じで、カンマで区切られて改行で並んでいます。 そこに新たに$dateと$contで受けたデータを先頭行に追加する感じです。 open(FILE,"<./data/xxx.txt"); while($temp = <FILE>){ @temp=split(/,/,$temp); push(@ddr,"$temp[0]","$temp[1]"); } seek(@ddr,0,0); unshift(@ddr,($date,$cont."\n")); open(FILE,">./data/xxx.txt"); $new=join(",",@ddr); print FILE $new; close(FILE); このように書いていますが、 print FILE @ddr とすると、配列が壊れた状態(全て繋がる)で先頭行には挿入されたのですが、カンマで区切って配列にして並べようとしたら、 test,test2 ,bbb,bbb2, ,,ccc,ccc2,, という感じで上手く並びません。 よろしくおねがいします。

    • ベストアンサー
    • Perl

専門家に質問してみよう