-
ID:X3TwMZ さんの質問

fseek()でファイルポインタを移動したはずなのに、任意の行に書き込むことができません。

fseek()は実はファイルポインタを移動してるだけで、行とは無関係なのでしょうか。

function writefile( $filename, $body, $lineNum=null ){
  $fp = fopen($filename, ’w’);
  if(gettype($lineNum)==’integer’)
  {
    echo (int)fseek( $fp, $lineNum);//★
  }

  fwrite( $fp, $body );
  fclose($fp);
}

★:成功はしているようです。

他の行にデータがあった場合でも任意の行にデータを書き込むにはどうしたらよいでしょう?

みんなの回答 3 件

ID:DGJMz5 さんの回答

fseekは行ではなく指定バイトの場所にポインタを移動する関数です。行とは関係ありません。また見たところwによるfopenをしているようですので、必ず内容が空つまり0バイトとなりfseekしてもポインタは移動しない気がしますが、やった事が無いのでそこは不明です。
データが既にあるファイルの任意の行にデータを書き込む際には、内容全体をfileで配列化し、好きな要素と要素の間に値を入れ込み、implodeなどで文字列化してfwriteで全て書き換えを行うなどの方法があります。あくまで一例です。

ID:X3TwMZ

お詳しいですね。ありがとうございます。

ID:/Gh04L

普通はこのやり方してる。

一旦全部PHP読んで、
PHP内で編集して、
それをもう一回csvなどに吐き出すというやり方。

ID:X3TwMZ

メモリ食いそうな気がして敬遠してるんです・・・

ID:/Gh04L

でも、たぶんそれしかできないよ。
数年前からそれやろうとしている人がいては、無理だと言って終わるという繰り返しを何度か見てきております。

ID:kMsNXM さんの回答

SplFileObjectなら行単位でポインタ動かせると思う
PHP5.1以上ならデフォルトで、5.3以上なら確実に入っているはずなので、こっちで操作するといいかも

PHP: SplFileObject::seek - Manual

http://www.php.net/manual/ja/splfileobject.seek.php
ID:X3TwMZ

おお、ありがとうございます。
いったいどこからこんな素晴らしい情報を仕入れてこれるのですか?

ID:X3TwMZ さんの回答

だめでした・・・
終端以降に行がない場合は移動できないのでしょうか・・・

$File = new SplFileObject($filename, ’a’);

if(gettype($line_pos)==’integer’)
{
  $File->seek($line_pos);
}

$File->fwrite($body);

最終更新日:2014-06-11 (5,550 views)

関連するトピックス

ページ上部に戻る