C言語 標準関数 | 応用 | サンプル

標準関数
構文
応用

管理人

プライバシーポリシー


書式

#include <stdio.h>

char * fgets( char *row , int len , FILE *fp );

■戻り値:
ファイルポインタfpから1行、またはlenバイト読み込んでその先頭アドレスを返す。
全行を読み込んだ場合、又はエラー時にNULL(\0)を返す。

説明

ファイルポインタfpから1行、またはlenバイトをrowに読み込みその先頭アドレスを返す。

fgetsで読み込むファイルはテキストファイルを対象とする。(バイナリファイルではそもそも改行(\n)と言う概念がない)

1行とは改行コード(\n)または読み込みバイトがファイルサイズに達するまでを指すが、左記の状態にならなくともlenに達した時点で1回の読み込み(関数実行)は終了し、残りは次回の読み込みで取得する。

1行読み込んだ領域の改行コードは削除されず、改行コードがあればそのまま読み込まれ、更に末尾にNULL(\0)が自動付与された状態になっている。従って、実際に読み込まれるのは自動付与されたNULLを除く(len-1)バイトになる。
通常、lenには「読み込み対象ファイルとしての仕様上の1行の最大バイト数」を少し超える値を指定するのが一般的である。

本関数fgetsは読み込みバイト数がファイルサイズに達するとNULLを返すが、エラー時もNULLを返すので区別が付かない。このことから一般的にはエラー判定は行わずNULLの返却を以って全行読み込んだものとしている。これは、もしファイルに障害があって読み込み不能であった場合、ファイルオープン時にエラー検出可能であるからだと言われている。

確実に判別したい場合には、feofferrorを使用すれば判別できる。

入力ファイル
(ファイルサイズはWindowsの場合は54バイト、Linuxの場合は51バイトであることを確認)

This is 1st row.
This is 2nd row.
This is 3rd row.
[EOF]

サンプル

#include <stdio.h>

main() {
  FILE * fp;
  char row[24];
  unsigned int i;

  /* Windows系の場合は"test.txt"にする */
  fp = fopen( "./test.txt" , "r" );
  if( fp == NULL ) {
    printf( "ファイルオープンエラー\n" );
    return -1;
  }

  while( fgets( row , sizeof( row ) , fp ) != NULL ) {
    printf( "row=%s" , row );/* rowの末尾は\n\0 */
    for( i=0;i<strlen( row );i++ ) {
      /* 1バイトずつ表示 */
      printf( "row[%d]=0x%02x\n" , i , row[i] );
    }
  }

  fclose( fp );

  return 0;
}

実行結果

row=This is 1st row.
row[0]=0x54
row[1]=0x68
row[2]=0x69
row[3]=0x73
row[4]=0x20
row[5]=0x69
row[6]=0x73
row[7]=0x20
row[8]=0x31
row[9]=0x73
row[10]=0x74
row[11]=0x20
row[12]=0x72
row[13]=0x6f
row[14]=0x77
row[15]=0x2e
row[16]=0x0a
row=This is 2nd row.
row[0]=0x54
row[1]=0x68
row[2]=0x69
row[3]=0x73
row[4]=0x20
row[5]=0x69
row[6]=0x73
row[7]=0x20
row[8]=0x32
row[9]=0x6e
row[10]=0x64
row[11]=0x20
row[12]=0x72
row[13]=0x6f
row[14]=0x77
row[15]=0x2e
row[16]=0x0a
row=This is 3rd row.
row[0]=0x54
row[1]=0x68
row[2]=0x69
row[3]=0x73
row[4]=0x20
row[5]=0x69
row[6]=0x73
row[7]=0x20
row[8]=0x33
row[9]=0x72
row[10]=0x64
row[11]=0x20
row[12]=0x72
row[13]=0x6f
row[14]=0x77
row[15]=0x2e
row[16]=0x0a


Copyright © 2008-2015 http://hitorilife.com All Rights Reserved.