PHPで嵌まる

PerlPHPはレガシーだという考えだけど、ちょいと気楽に書くのには楽。で、

$f=fopen('filename','r);
while( !feof($f) ) {
 。。。
}

というコードで、ファイルが存在しないときに、fopenがエラーのため $f がFALSE になって、それを引数にしている feof もエラーになって FALSE。while 条件はそれを ! しているため TRUE になって無限ループ発生。

ちゃんとエラーチェックしないからだという突っ込みがあるでしょうが、実はしてました。

$f=fopen('filename','r) or dir('fopen');

いや、しているつもりでした。d i と打つと、その次はつい r と打ってしまう。
opendirのエラーメッセージが出たので原因にはすぐ気づいたんだけど、そのときは遅し。これからは die じゃなくて exit と書くことにしよう。


feof()を使うのは、リファレンスの fgets() のところにあるサンプルに倣ったのだけど、

while( $line=fgetss($f,99) ) {

にすればよかったのかな?入力文字が 0 だったりすると駄目かと思ったけど、改行がくっつくので、「ファイルの最後の行が0でその後に改行が無い」という通常は心配しないケースを除けばOKかな?と思ったけど、

<tag>0<tag2
>1<tag3>

のようなケースがあると駄目。と、ここで気づいたけど、fgetss()ってタグの途中で改行があると駄目なのか。