test.txtファイルからテキストを読み込むプログラムを以下に示す.何の不思議もない,ごく一般的なプログラムである.
▼fgets.c#include <stdio.h> int main(void) { FILE* fp ; char buff[256]; /* オープン */ if( (fp = fopen( "test.txt", "rt" )) == NULL ) return -1; /* 読み込み */ while( NULL != fgets(buff,sizeof(buff),fp)) printf("%s",buff); /* クローズ */ fclose( fp ) ; return 0; }(ここが変だよC言語 下, p.82)
「何の不思議もない」どころか,小さな不思議があちこちにあります.
- fopenの第二引数の中の「t」は通常,使われません.
- JIS X 3010 7.19.5.3には記載がありません.ただし脚注(272)から,「t」は無視されるということでしょう.
- 他の本を見ると,次のように言及されていました.
オープンモードに使用できる文字列は,処理系により拡張されていることもあります.例えば,テキストファイルであることを明示的に示す"t"が"b"(バイナリ指定)と対になっている場合があります.
(C言語によるプログラミング[スーパーリファレンス編], p.464)
- バッファの変数にbuffというのは,見かけたことがありません.bufでしょう.と思っていくつか調べたのですが,これはbuffでも問題なさそうです.
- http://www.linux.or.jp/JM/html/LDP_man-pages/man3/fgets.3.htmlで,fgetsの第1引数の変数名はsです*1.
- C言語によるプログラミング[スーパーリファレンス編](p.462)では,fgetsの第1引数の変数名はstrです.
- google:buff+bufferでは,約 984,000 件.
- google:buf+bufferでは,約 1,760,000 件.
あとは,ファイル処理とは直接関係のないツッコミですThe following indications bear no immediate relationship to file processing.
- 空白の付け方に,一貫性がありません.fopenの行は空白が多く,fgetsの行の後半は空白がありません.自分としては,それぞれ以下のようにしないと気味が悪いです.
if ((fp = fopen("test.txt", "rt")) == NULL)
while (NULL != fgets(buff, sizeof(buff), fp))
- 「if (NULL != …)」のように,比較演算子の左辺に定数を書くのは,一時期の流行であり,学生には,現在では使わないようと教えています.