わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

テキストモードでファイルを開く

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でも問題なさそうです.

あとは,ファイル処理とは直接関係のないツッコミです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 != …)」のように,比較演算子の左辺に定数を書くのは,一時期の流行であり,学生には,現在では使わないようと教えています.

*1:setbufでは,関数名の末尾はbuffではなくbufですし,引数の中にbufという変数も見えますね….