• ベストアンサー

file関数とファイルポインタ

ファイルの内容を(書き換えるために一旦)読み込む時に、 fgets関数と違ってfile関数は fopen関数を使わなくても済む、ということで 便利なので使ってみようと思っているのですが、 ちょっと躓いています。 set_file_bufferやflock、rewindが必要なのですが、 これらはどれも引数にファイルポインタを使います。 fopen関数を使っていないのでコレがないのですが、 どうすればいいのでしょうか? fopenのあとにfileを使う? fopenを使わなくても閉じる時にはfcloseが必要? でもfcloseもファイルポインタを使うし… よろしくお願いします。

  • PHP
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • kusukusu
  • ベストアンサー率38% (141/363)
回答No.2

> fopen(),fclose()と、file()は同時に使えますか? 使えます。 同一の処理であれば、 $file=file("hoge.txt"); $fp=fopen("hoge.txt","w"); foreah($file as $f) {   (ファイルポインタを用いた処理) } って言う形でよく利用します。

infinity
質問者

お礼

ありがとうございます。 fopen()は使わなくても済む、というのは置いといて、 fgets()のかわりに使うぐらいの感覚で良さそうですね。 (大きなファイルだとfile()は負担になるけど)

その他の回答 (1)

  • nightowl
  • ベストアンサー率44% (490/1101)
回答No.1

PHP はよく知らないのですが、ウェブのマニュアルを見た限り、 file 関数はファイルの内容を読み込んで配列として返すのですよね? fopen() が必要でない代わり、低レベルなことは何一つできないと思われます。 set_file_buffer() や flock(), rewind() が必要であれば、fopen() からは逃れられません。 それならば、最初から fopen() しておいて、fgets() や fread() で読み込んだ方が いいのではありませんか?(Cそっくりですね) >fopenを使わなくても閉じる時にはfcloseが必要? file() だけを使い、fopen() しなければ fclose() は要らないでしょう。

参考URL:
http://php.planetmirror.com/manual/ja/printwn/ref.filesystem.php
infinity
質問者

お礼

なるほど、file()は読み込み専用、 ぐらいに考えておくといいのですかね。 掲示板の表示部分には重宝しそうです。 fgets()も使えないことはないのですが、 1行ずつ処理しなきゃいけないので多少複雑になります。 それでfile()と思ったわけです。 最後に1つだけ質問。 fopen(),fclose()と、file()は同時に使えますか? ご存知の方、よろしくお願いします。

関連するQ&A

  • ファイルを開いたままオープンモードを変更したい

    $fp = fopen ($file, "r"); flock ($fp, 2); で開いたファイルをロックを解除しないままファイルを空にして書き込みモードに移行する方法を教えてください。 或いは $fp = fopen ($file, "r+"); flock ($fp, 2); からfputs()で書き込んだ後にファイルのファイルポインタ以降の部分を切り捨てる形でも良いです。 flock ($fp, 2);の後にfgetsによりファイル内容を取得した後ファイルロックをしたままファイルの余計な部分を捨てたいので $fp = fopen ($file, "w"); flock ($fp, 2); や $fp = fopen ($file, "r"); flock ($fp, 2); fgets ($fp); flock ($fp, 3); fclose ($fp); $fp = fopen ($file, "w"); flock ($fp, 2); は必要ありません。

    • ベストアンサー
    • PHP
  • PHP、外部ファイルにテキストを書きだす。

    こんにちは、皆様。 下記のソースを実行したいと思います。期待する結果としては、外部ファイルに行列に書き出すことです。 <?php $count_file="count.dat"; if(file_exists($count_file)){ $file = fopen("count.dat", "a") or die("file can not open"); $order_no = fgets($file) + time(); print $order_no; }else{ $file = fopen($count_file, "w") or die("file can not open"); $order_no = time(); } set_file_buffer($file,0); flock($file, LOCK_EX); fputs($file , $order_no); flock($file, LOCK_UN); fclose($file); ?> このソースの結果は配列として書き込まれてました。こんな感じです。 129835261512983526501298355377129835537912983566121298356635 このソースを実行する度にcount.datファイルに順次書き出したと思います。 1298352615 1298352650 1298355377 1298355379 1298356612 1298356635 まだまだPHP勉強中なのでわかる方教えてください。 (1)この行で$order_no = fgets($file) + time(); 改行記号をどう付ければ良いでしょうか? (2) C言語のようにポインターで指定しなければならないですか?書き方を教えてください。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • カウンター 増えないのは?

    お世話になります。 下記、サンプルを参考にちょっとカウンターのスクリプトを書いてみたのですが、どうもカウントがアップしません。 どこがおかしいのかご指摘いただけると幸いです。 <?php //カウンターファイル $cnt_file = "count.dat"; //カウンター桁数 $cnt_len = 10; //カウンターファイルが存在すればカウンター値を読取る if(file_exists($cnt_file)){ $file = fopen($cnt_file, "r+"); $conut = fgets($file, $cnt_len); $count = $count + 1; } //ファイルなし新規作成 else { $file = fopen($cnt_file, "w"); $conut = 1; } //ファイルポインタを先頭にセットする rewind($file); //ロック flock($file, LOCK_EX); //書きこみ fputs($file, $conut, $cnt_len); //ロック解除 flock($file, LOCK_UN); //閉じる fclose($file); ?>

    • ベストアンサー
    • PHP
  • fcloseをしない場合のファイルポインタ

    一般的にファイル関連の処理をするとき $fh = fopen($tmp_file_name,"r"); 何か処理 fclose($fh); という感じで最後にfcloseをすると思います。 このfcloseをしない場合ってファイルポインタ(? 要はファイルへの参照、開いているという情報)はどうなるのでしょうか? 一般的なプログラムでDB接続をクローズし忘れたときみたいに接続だけが残って以後、参照不能やリソース不足に陥ったりするのでしょうか? それともスクリプトを実行し終えた瞬間に勝手に開放されるのでしょうか? flockについて考慮しない前提でお願いします。

    • ベストアンサー
    • PHP
  • ファイルの内容の削除【ファイルシステム関数】

    以下のユーザー定義関数で、POSTで受け取った数値の増減をあるファイルに書き換える作業をおこないたいのですが、1桁の数値であれば問題ないのですが、2桁の数値にし、マイナスの数値で減らすと値が「00」となってしまいます。文字列として認識してしまっているためかとは存じますが、良い解決方法が思い浮かびません。以下ソースです。 <? function cnt($str){ if(isset($_POST[$str])){ $fp = fopen( $str.".txt", "r+" ); flock($fp,2); $count = fgets( $fp, 5 ); $strstr = $_POST["$str"]; $count+= $strstr; rewind( $fp ); fputs( $fp, $count ); flock($fp,3); fclose( $fp ); print($count); }else{ $fp = fopen( $str.".txt", "r" ); $count = fgets( $fp, 5 ); print($count); };} ?> ファイルシステム関数については苦手で、うまく理解しきれていません。 アイデア・解決法をご存知の方がいらっしゃいましたら、ご回答いただければうれしいです。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHP4.1でファイル読み込みできない

    次のような方法でファイルの読み込みをしていますが、4.1の環境だと右上の地球アイコンが回りっぱなしでページが表示されなくなります。 $fo=@fopen($data_file,"r") or err("データファイルを読み込めません"); flock($fo, LOCK_EX); $i=0; while(!feof($fo)){ $text_buff=fgets($fo); if(trim($text_buff)){ $buff[$i]=$text_buff; } $i++; } flock($fo, LOCK_UN); fclose($fo); file関数で読み込んだら問題なかったので、現在はfile関数を使っていますが、どのコマンドが問題なのかわかりません。 file関数だとfilelockされないので、同時アクセスされた場合データの破壊があると聞いておりますのでできればfopenで処理したいと考えています。 php.iniなどで回避可能なのでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • カウンターを一定数でリセットしたい

    はじめまして。 レッツPHPのカウンタを使っています。 <?php $fp = fopen("count.txt","r+") or die("Error!"); $count = fgets($fp, 64); $count++; rewind($fp); //set_file_buffer($fp, 0); flock($fp, LOCK_EX); fputs($fp, $count); fclose($fp); echo $count; ?> count_file.txt にはA00と記入しているのでA99になったら次はB00~Z99までカウントされるのを、F99まできたらリセットしA00から始めたいのですが式が分りません。$count++;を書き換えればいいのだとは思いますが・・・ よろしくお願いいたします。 PHP4.3.3

    • ベストアンサー
    • PHP
  • 新規でファイルを作成したい

     お世話になっております。  PHPで新規でファイルを作成する方法がうまくいかないのでおしえてください。  fopen関数で、ファイルを開こうとするとき解説書にあるように、「ファイルがなければ新規で作成」というモードを使用しているのですが、このファイルが作成されません。  新規でファイルを作成するモードは、"w" "a" "a+"の筈ですが…。 $temp_file_open = fopen("temp.txt", "w"); flock($temp_file_open, LOCK_EX); $temp_return = fputs($temp_file_open, "$name\n"); flock($temp_file_open, LOCK_UN); fclose($temp_file_open);  このような形で単純に書いているのですが、なかなかうまく行きません。Perlではumaskの設定などが必要ですが、PHPでも必要なのでしょうか?  もし足りない点、または初心者が陥りやすい点を指摘していただけるとありがたいです。

    • ベストアンサー
    • PHP
  • fopenとfile_put_contents

    ファイルを操作する関数「fopen」と「file_put_contents」を勉強していて 不思議に思いました。 「fopen」を使ったファイルに書き出す場合 「fopen」→「flock(LOCK_EX)」→「fputs」→「flock(ロック解除)」→「fclose」の 流れが必須になるようですが 「file_put_contents(FILE_APPEND | LOCK_EX)」の場合、 この関数一つで同じような処理されるようですが ロックやロックの解除、書き込んだファイルを閉じるなどの 役割がすべて補われるのでしょうか? 「file_get_contents」も同じだような役割りのようで 手間をかけて複雑になってしまう「fopen」を使う理由は あるのでしょうか? 処理工程など多少の違いの説明は読んでみたのですが 複雑になる「fopen」を使う必要性が分かりません。 よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ファイルポインタが動かない・・・

    ファイルポインタがfgetしても動かなくなるような宣言の仕方や 引数の渡し方ってあるのでしょうか? C言語で書いたプログラムです(長いので構造を書きます) わかりにくければ補足します。 #include"stdio.h" static FILE fp1; main() { 変数宣言うんぬん プロトタイプ宣言うんぬん fopen(.....); a = kansuu; fclose; } int kansuu() 変数宣言うんぬん for(i=0;i<3;i++) { x=fgetc(fp1); printf("%d-%d\n",x,ftell(fp1)); } ファイルには 0123456789 出力が 0-0 0-0 0-0 ってなるんです Seek関数(SEEK_CURとか)を使うとファイルポインタは動きます。 お願いします。

専門家に質問してみよう