fgetc関数 - ファイルから1文字読み込む

fgetc関数は、ファイルから1文字読み込む関数です。stdio.hヘッダを読み込むと使えます。

#include <stdio.h>
int fgetc(FILE *fp);

ファイルストリームから1文字読み込み、読み込んだ文字を返します。ファイルの最後に到達した場合は、EOFが返ります。

fgetc関数のサンプル

fgetc関数のサンプルです。fopen関数で読み込みモードでファイルを開き、fgetc関数で1文字づつ読み込み、標準出力に出力し、fclose関数でファイルを閉じています。

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(void) {
  
  // ファイルを読み込みモードで開く
  const char* in_file = "input.txt";
  FILE* in_fp = fopen(in_file, "r");
  if (in_fp == NULL) {
    fprintf(stderr, "Can't open file %s\n", in_file);
    exit(1);
  }
  
  // 読み込んで、標準出力に出力
  int32_t ch;
  while(ch = fgetc(in_fp)) {
    // EOFが返ってきた場合
    if (ch == EOF) {
      // ファイルの末尾かチェックする
      if (feof(in_fp)) {
        break;
      }
    }
    fputc(ch, stdout);
  }
  
  // fclose関数でファイルを閉じる
  fclose(in_fp);
}

入力ファイル「input.txt」です。

Hello
World!

出力結果です。

Hello
World!

ファイル途中でEOFが見つかったらどうなるの?

ファイルの途中でEOFが見つかったら、EOFが返ります。ですので、EOFは、本当のファイル終端であるとは限らないということを覚えておきましょう。本当のファイルの末尾であることを確認するにはfeof関数を使用します。

    // EOFが返ってきた場合
    if (ch == EOF) {
      // ファイルの末尾かチェックする
      if (feof(in_fp)) {
        break;
      }
    }

fgetc関数はgetc関数と何が違うの?

getc関数は、fget関数と同様に、ファイルから1文字読み出しますが、パフォーマンスの向上のために関数マクロとして実装することが許可されています。fgetcは関数として実装されます。

実装経験としては、getcはマクロとして実装可能なので、何らかの副作用があります。はっきりとは思い出せないのですが、FreeBSDの環境でコンパイルエラーが生じた経験があります。

読み込みパフォーマンスに問題がなく、ポータビリティの問題を生じさせたくない場合は、fgetc関数を使うのがよいでしょう。

関連情報