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