【C言語入門】fgetsの使い方

こんにちは、もがちゃんです

C言語でテキストファイルから入力する際に、よく利用するのがfgets関数です

fgets関数は、ファイルからの入力時に利用されるので
fopen関数、fclose関数と一緒に使用されます

この記事では
fgets関数の使い方を簡単なサンプルソースとともに説明します

fgetsの構文

#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);

fgetsの説明

fgetsは、streamで指定されたファイルポインタに紐づくファイルから文字列を取得する関数です

一回のfgets関数呼び出しで、ファイルから取得できる最大サイズは、n-1バイトですが、途中に改行文字が出現した場合は、改行文字までを取得します

ファイルの終わりが検出された場合は、ファイルの終わりまで取得します

ファイルから取得した文字列の最後には、NULL文字が付加されます

fgets関数は、streamが指すストリームから文字の列を読み取り、sが指す配列に格納する。
このとき、n-1を読み取る文字数の最大値とする。改行文字を読み取ったとき、又はファイルの終わりを検出したときに、文字の読取りは終了する(読み取った改行文字も配列に格納する。)。そして,最後に配列に格納した文字の後にナル文字を書き込む。

JISX3010 プログラム言語C
s

streamで指定されたファイルから、文字列を取得する際、取得した文字列を格納する領域の先頭ポインタを指定します
sで指定する領域の最大サイズは、nバイト以上にする必要があります

n

streamで指定されたファイルから、一度に取得するバイト数+1を指定します
sで指定する領域のサイズ以下にする必要があります
通常は、sで指定する領域のサイズを指定します

stream

読み取りたいファイルに紐づくファイルポインタを指定します
(fopen関数の返却値を指定します)

返却値

ファイルからの読み取りに
成功した場合は、sを返します
ファイルの終わりを検出し、1文字も取得できなかった場合は、NULLを返します
失敗した場合は、NULLを返します

fgets関数は、成功するとsを返す。ファイルの終わりを検出し、かつ配列に1文字も読み取っていなかった場合、配列の内容を変化させずに残し、空ポインタを返す。読取りエラーが発生した場合も空ポインタを返すが、この場合の配列の内容は、不定とする。

JISX3010 プログラム言語C

fgetsの使い方サンプル

テキストファイルから文字列を取得する簡単なサンプルプログラムを紹介します

nが1行のバイト数未満のサンプル

test1.txt
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890

サンプルソースと実行結果
#include <stdio.h>
int main(int argc, char *argv[]) {
  // "r"モードで test1.txt ファイルをオープン
  FILE *fp = fopen("test1.txt","r");
  if(fp != NULL) {
    // ファイルオープンが成功したら
    char buffer[512];
    //1行ずつbufferに読み込み標準出力へ出力する
    while(fgets(buffer, 11, fp) != NULL) {
      printf("%s\n", buffer);
    }
    // ファイルをクローズする
    int ret = fclose(fp);
    if(ret != 0) {
      printf("fclose()に失敗しました![%d]\n", ret);
    }
  }
}
nが1行のバイト数未満のサンプルプログラムと動作結果
nが1行のバイト数未満のサンプルプログラムと動作結果

nが1行のバイト数超のサンプル

test1.txt
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890
1234567890abcdefghijklmnopqrstuvwxyz1234567890

サンプルソースと実行結果
#include <stdio.h>
int main(int argc, char *argv[]) {
  // "r"モードで test1.txt ファイルをオープン
  FILE *fp = fopen("test1.txt","r");
  if(fp != NULL) {
    // ファイルオープンが成功したら
    char buffer[512];
    //1行ずつbufferに読み込み標準出力へ出力する
    while(fgets(buffer, 512, fp) != NULL) {
      printf("%s\n", buffer);
    }
    // ファイルをクローズする
    int ret = fclose(fp);
    if(ret != 0) {
      printf("fclose()に失敗しました![%d]\n", ret);
    }
  }
}
nが1行のバイト数超のサンプルプログラムと動作結果
nが1行のバイト数超のサンプルプログラムと動作結果

fgetsのまとめ

fgets関数は、fopen関数、fclose関数とセットで使用する

fgets関数で指定する s の領域は、最低 n バイト以上の領域を用意する

fgets関数で指定する n の値は、s の領域サイズ以下で指定する

fgets関数で取得した文字列の最後には、NULLが付加される

1回のfgets関数呼び出しで取得できる文字列は以下の通り

  • n – 1バイトまで
  • 改行まで
  • ファイルの終わりまで

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA