揮発性のメモ2

http://d.hatena.ne.jp/iww/

feofでループするとバグる

feof() は終端まで到達していたらEOFを返すけど、終端かどうかは最後の文字の次の文字を読むまでわからない。
よって、while(!feof() みたいにループで1文字ずつ読むと、必ず最後にゴミがでる。

今までファイルを1文字ずつ読んだことなんかなかったので、初めて気づいた

<?php
$fp=fopen($argv[1],"r") or die("fopen");
while(!feof($fp)){
    $c = fgetc($fp);
    if($c===false){
        echo "ナンデ?\n";
    }else{
        echo ord($c).",";
    }
}
#include <stdio.h>

int main(int argc, char *argv[])
{
    FILE *fp;
    int c;

    fp = fopen(argv[1],"r");
    if(fp==NULL){
        perror("fopen");
        return 1;
    }
    while(!feof(fp)){
        c = fgetc(fp);
        if(c==EOF){
            printf("ナンデ?\n");
        }else{
            printf("%d,",c);
        }
    }

    return 0;
}


ググったら文句を言っている人はいっぱいいた。 PHPに至ってはマニュアルで愚痴ってる
stackoverflow.com
hnw.hatenablog.com
https://www.php.net/manual/ja/function.feof.php