5月 07

昨日、PHPのアクセスカウンタがうまく動いていないので、訪問者概要と内部カウント変数のLOGを記録するように変更して、様子を見てみたら、すぐに原因が解った。

原因は、ファイルのモードの指定と書き込みロジックにあった。

ファイルの先頭から、内容を上書きで書き換えているため、書き込む前に書いてあった内容の方が、後から書き込む内容より大きかった場合、大きい分はそのまま残ってしまっていた。

つまり、元のファイルの内容が「51,17,5」(7byte)を「52,5,1」(6byte)に書き換えようとすると「52,5,15」(7byte)になってしまっていた。

もう少し、詳しく書くと、

  1. ファイル(count.dat)を、読み書きモード(fopenで’r+’)で開く
  2. ファイル内容の読込(fgets)
  3. rewindでポインタをファイルの先頭におく
  4. ファイル内容の書込(fputs)
  5. ファイルを閉じる(fclose)

と処理していたために起こっていた、初歩的なミス。

可変長のデータをポインタを先頭において上書きしてもダメですよね….orz

これを

  1. ファイル(count.dat)を、読込モード(fopenで’r’)で開く
  2. ファイル内容の読込(fgets)
  3. ファイルを閉じる(fclose)
  4. ファイル(count.dat)を、新規書込モード(fopenで’w’)で開く
  5. ファイル内容の書込(fputs)
  6. ファイルを閉じる(fclose)

に変更して、無事解決。

最近、データ処理は、DBばっかりで、ファイルを使うことがめっきり減ってしまったので、こういう初歩的なミスをしないように気をつけねばいけませんね。

これで、もう少し様子をみて、問題内容であれば、公開してみたいと思います。(大したプログラムではないのですが。。。。)

written by Miew \\ tags: , ,


この記事のトラックバック Trackback URL

Leave a Reply