• ベストアンサー

fputsでの書込み→最初に書いたレコードが消える

data.txtと言うファイルに 1レコード50バイトのテキストを書込みたいのです 次のようなコマンドを使って; fseek($fp,$pos ); fputs($fp, $eeData."\n"); $posには1,51,101・・・が入ります 直前に書いたデータは書き込まれていますが その前に書いたデータが消えてしまいます fseekの使い方がいけないのでしょうか よろしくお願いします

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#1補足>質問文の内容から、ほとんど、シーケンシャルに書き込みしているようだったので、 #1でfseekが必要ないと回答しましたが、 部分書き込みをするなら、 fseekで位置づけして、 fputsで書き込みでできます。 念のために、テストしてみましたが問題有りませんでした。 なお、windowsの環境では、改行コードの扱いがUNIX環境とは違うので注意が必要です。 winodwsで試してみましたが、 "ABCDEF\n"をfputsで書き込んだ場合、 私の環境では、 "\n"が0x0Aで書き込まれました。 "\r\n"にすると 0x0D0Aになりうまく置き換えができました。 fseekのオフセット($pos)は、0オリジン(0で始まる)です。 例えば 123456789 ABCDEFGHI abcdefghi の様なデータの時、 各行の先頭のオフセットは、 0,11,22 です。(改行コードで2バイト) 環境によって異なりますが その辺も考慮されて、プログラムされるといいのではないかと思います。 あと、fseekが成功しているかどうかも調べた方がいいかもしれません。 テストの段階では、 r+モードでfopenして、fseekで位置づけした位置で予想したレコードが読めるかどうかもやってみた方がいいかもしれません。

ppmi
質問者

お礼

詳しく解説していただき ありがとうございました 一歩前進することができました

その他の回答 (1)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

fseekは、必要ないんじゃないでしょうか

ppmi
質問者

補足

返事ありがとうございました。 fseekは現在ファイルに1000バイトのデータが 入っているとすると、51バイト目~100バイト の部分を書き換えるのに使おうと思ったのですが そもそも、fputsはそういう、部分writeはできない んですかね?

関連するQ&A