HIR-NET Home 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集
Tweet このエントリーをはてなブックマークに追加
C言語辞典

fgetsエフ・ゲット・エス関数かんすう
fgets function

語源  fileファイオ getゲット stringストリング(ファイル文字入力)
分類  C/C++標準ライブラリ/関数/入出力関数/入力関数/文字列入力関数
名称  ファイル文字列入力関数(file string input function)
対義  fputs関数
同等  fgetws関数
類似  gets関数
関連  fopen関数, feof関数, ferror関数
解説  fgets関数は、ファイルから文字列を読み込む関数です。入力ストリーム*stream から配列*s…に、(改行文字を含んで)nバイト未満の文字を入力します。文字の読込はファイルの終わりか、改行文字まで行われます(改行文字は配列に格納されます)。最後に配列に格納した文字の直後には空文字が付加されます。
テキスト・ストリームの最終行に終端を示す改行文字があるかどうかは処理系に依存しますので、最終行を読込後の配列の空文字の前に改行文字がない場合があります。

関数原型宣言ヘッダ  <stdio.h>
関数原型宣言例
入力文字列の格納配列
     (n以上の大きさ)   配列sのバイト数(2~)
                 ↓    ↓
char *fgets(char *s,int n,FILE *stream);
↓                                ↑
NULL≠入力文字列              入力ストリーム
NULL=失敗

関数返却値
①成功時には s を返します。
②ファイルの終わりに達し、配列s に文字が読み込まれなかった場合は NULL(空ポインタ)を返します(配列に文字が読み込まれなかったのですから、配列の内容は呼出前と変化はありません)。
③操作中に読込エラーが発生した場合は NULL を返します(配列の内容は不定です)。

注意1  fgets関数は、GET String(文字列入力)であって、GET Line(行入力)ではありません。ファイルの終わりか、改行文字に達する前に、n-1バイトに達した場合は、読込後の配列の空文字の前に改行文字はありません。この場合、最も注意すべき点は、次に fgets関数が呼び出された場合は、次の行の先頭が読まれるのではなく、同じ行の最後に読まれた次の文字から読み込まれることです。

注意2  改行文字の扱いは関数によって逆になっています。
  gets(捨てる  ), puts (付加して出力)
 fgets(読み込む), fputs(付加しない  )

関数定義例
// fgets.c

#include <stdio.h> // FILE,EOF,NULL,ferror,getc


char *fgets( // ファイル文字列入力関数
// NULL≠入力文字列
// NULL=入力失敗
char      *s, // =>入力文字列の格納配列 (nバイト以上の大きさ)
int        n, // 配列s のバイト数(2~)
FILE *stream) // 入力ストリーム
{
  char *const head=s; // 先頭ポインタ保存

  for(;n>1;n--)
  {
    int c=getc(stream); // 1文字入力
    if(c==EOF)break;
    *s=c; // 配列に代入
    s++;  // sを進める
    if(c=='\n')break; // 行の終わり検出
  } // for

  if(s==head // 読込なし
  || ferror(stream))return NULL; // ●入力失敗

  *s='\0';
//[解説]ファイルの終わりに達し、配列s に文字
// が読み込まれなかった場合は NULL を返し、
// 配列の内容は不変。そのため、NULLを返す場合は
// *s='\0' は行わない。

  return head;
} // fgets


 プログラム例   

1行ずつのファイル内容表示
ファイルを1行ずつ読み込み、内容を表示する。
// fgets1.c

#include <stdio.h> // FILE,NULL,fgets,fopen,printf
#include <stdlib.h> // EXIT_SUCCESS


main(int argc,char *argv[])
{
  char s[256]; // 配列宣言
  FILE *sget; // 入力ストリーム Stream GET
  sget=fopen(argv[1],"r");

  while(fgets(s,sizeof s,sget)!=NULL)
    printf("[%s",s);

  return EXIT_SUCCESS;
} // main
実行結果
>>type fgets.tes⏎  …… ファイルの内容確認
abcdefg
123

>>fgets1 fgets.tes⏎
[abcdefg
[123

>>■





HIR-NET Home 運営者 オンラインソフト 運営者著書 CG HIR-NETリンク集
◆リンクは、ご自由にお張りください。

Copyright © 1988-2017 Hirabayashi Masahide  プライバシーポリシー