fgets(3)はwhileループの中でどう使えばいいのか、検証してみた。
以下、ソース全文。
whileの部分を変えてみる。
#include <stdio.h> #include <string.h> void testfunc(char *buf){ printf("%s\n", buf); } /* end of testfunc */ void main(int argc, char *argv[]){ if(argc !=2){printf("argument error\n");return;} FILE *fp = fopen(argv[1], "r"); char buf[16]; char *p; /* test start ---> */ while(!feof(fp)){ fgets(buf, 16, fp); p = strchr(buf, '\n'); if(p){*p = '\0';} testfunc(buf); } /* end of while */ /* <--- test end */ fclose(fp); } /* end of main */
読ませるファイルは以下の2パターン。
test1.dat
A
BB
CCC[EOF]
test2.dat
A
BB
CCC
[EOF]
- <パターン1> whileの条件式でfeof()を使う
while(!feof(fp)){ fgets(buf, 16, fp); p = strchr(buf, '\n'); if(p){*p = '\0';} testfunc(buf); } /* end of while */
test1.datを渡した結果
A
BB
CCC
test2.datを渡した結果
A
BB
CCC
CCC
4行目の出力は、bufに残っている内容を出力しているもの。
- <パターン2> feof()でbreakする
while(1){ fgets(buf, 16, fp); if(feof(fp)){break;} p = strchr(buf, '\n'); if(p){*p = '\0';} testfunc(buf); } /* end of while */
test1.datを渡した結果
A
BB
test2.datを渡した結果
A
BB
CCC
- <パターン3> whileの条件式でfgets()の返り値を使う
while(fgets(buf, 16, fp)){ p = strchr(buf, '\n'); if(p){*p = '\0';} testfunc(buf); } /* end of while */
test1.datを渡した結果
A
BB
CCC
test2.datを渡した結果
A
BB
CCC
こうしてみると、パターン3(fgets()の返り値をwhile文の条件式に使う)がいいのか。