|
5月
07
|
昨日、PHPのアクセスカウンタがうまく動いていないので、訪問者概要と内部カウント変数のLOGを記録するように変更して、様子を見てみたら、すぐに原因が解った。
原因は、ファイルのモードの指定と書き込みロジックにあった。
ファイルの先頭から、内容を上書きで書き換えているため、書き込む前に書いてあった内容の方が、後から書き込む内容より大きかった場合、大きい分はそのまま残ってしまっていた。
つまり、元のファイルの内容が「51,17,5」(7byte)を「52,5,1」(6byte)に書き換えようとすると「52,5,15」(7byte)になってしまっていた。
もう少し、詳しく書くと、
- ファイル(count.dat)を、読み書きモード(fopenで’r+’)で開く
- ファイル内容の読込(fgets)
- rewindでポインタをファイルの先頭におく
- ファイル内容の書込(fputs)
- ファイルを閉じる(fclose)
と処理していたために起こっていた、初歩的なミス。
可変長のデータをポインタを先頭において上書きしてもダメですよね….orz
これを
- ファイル(count.dat)を、読込モード(fopenで’r’)で開く
- ファイル内容の読込(fgets)
- ファイルを閉じる(fclose)
- ファイル(count.dat)を、新規書込モード(fopenで’w’)で開く
- ファイル内容の書込(fputs)
- ファイルを閉じる(fclose)
に変更して、無事解決。
最近、データ処理は、DBばっかりで、ファイルを使うことがめっきり減ってしまったので、こういう初歩的なミスをしないように気をつけねばいけませんね。
これで、もう少し様子をみて、問題内容であれば、公開してみたいと思います。(大したプログラムではないのですが。。。。)
最近のコメント