ファイル入出力におけるgetc関数とその他の方法の比較

2024-04-02

C言語におけるファイル入出力とgetc関数

このチュートリアルでは、以下の内容について解説します:

  • ファイル入出力の概要
  • getc関数の機能
  • getc関数の使い方
  • getc関数のエラー処理
  • getc関数とその他のファイル入出力関数の比較

ファイル入出力の概要

C言語では、FILE構造体と呼ばれるデータ型を使ってファイル入出力を処理します。FILE構造体には、ファイルポインタやバッファなどの情報が含まれます。

ファイルを開くには、fopen()関数を使用します。fopen()関数は、ファイル名とオープンモードを指定して、FILE構造体のポインタを返します。

ファイルからデータを読み込むには、getc()fread()などの関数を使用します。getc()関数は、ファイルポインタを指定して、ファイルから1文字ずつ読み込みます。

ファイルにデータを書き込むには、putc()fwrite()などの関数を使用します。putc()関数は、ファイルポインタと文字を指定して、ファイルに1文字ずつ書き込みます。

ファイルを読み書き終えたら、fclose()関数を使ってファイルを閉じます。

getc関数の機能

getc()関数は、以下の機能を提供します。

  • ファイルから1文字ずつ読み込む
  • ファイルポインタを1文字分進める
  • EOF(End of File)を検知する

getc関数の使い方

getc()関数は、以下の形式で呼び出します。

int getc(FILE *stream);
  • stream: 読み込むファイルを表すFILE構造体のポインタ

getc()関数は、成功した場合には読み込んだ文字のASCIIコードを返します。EOFに達した場合は、EOF(-1)を返します。

以下の例は、getc()関数を使ってファイルから1文字ずつ読み込み、標準出力に表示するプログラムです。

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、標準出力に表示する
  while ((ch = getc(fp)) != EOF) {
    putchar(ch);
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

getc関数のエラー処理

getc()関数は、以下のエラーが発生する可能性があります。

  • ファイルが開けない
  • ファイル読み込み中にエラーが発生する

これらのエラーを処理するには、ferror()feof()などの関数を使用します。

以下の例は、getc()関数でエラーが発生した場合にエラーメッセージを表示するプログラムです。

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、標準出力に表示する
  while ((ch = getc(fp)) != EOF) {
    if (ferror(fp)) {
      perror("getc");
      break;
    }
    putchar(ch);
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

getc関数とその他のファイル入出力関数の比較

getc()関数以外にも、ファイル入出力を行うための関数がいくつかあります。

  • getchar()関数: 標準入力から1文字ずつ読み込む
  • fgetc()関数: ファイルから1文字ずつ読み込む(getc()関数と同等)
  • fread()関数: ファイルからデータをバッファに読み込む
  • fwrite()関数: バッファからデータをファイルに書き込む

これらの関数は、それぞれ異なる機能を提供しているので、目的に合った関数を選択する必要があります。

getc()関数は、C言語でファイルから1文字ずつ読み込むための基本的な関数です。このチュートリアルで解説した内容を参考に



getc関数を使ったサンプルコード

ファイルの内容を標準出力に表示する

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、標準出力に表示する
  while ((ch = getc(fp)) != EOF) {
    putchar(ch);
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ファイルの内容を逆順に表示する

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;
  long pos;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルポインタをファイル末尾に移動する
  fseek(fp, 0, SEEK_END);

  // ファイルポインタの現在の位置を取得する
  pos = ftell(fp);

  // ファイルポインタを1文字ずつ前方に移動し、文字を表示する
  while (pos > 0) {
    fseek(fp, pos - 1, SEEK_SET);
    ch = getc(fp);
    putchar(ch);
    pos--;
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ファイルから特定の文字列を検索する

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;
  int found = 0;
  char str[] = "検索する文字列";

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、検索文字列と比較する
  while ((ch = getc(fp)) != EOF) {
    if (ch == str[0]) {
      // 検索文字列の最初の文字と一致した場合
      int i;
      for (i = 1; i < strlen(str); i++) {
        if ((ch = getc(fp)) != str[i]) {
          break;
        }
      }
      if (i == strlen(str)) {
        // 検索文字列が見つかった
        found = 1;
        break;
      }
    }
  }

  // 検索結果を表示する
  if (found) {
    printf("検索文字列が見つかりました\n");
  } else {
    printf("検索文字列が見つかりませんでした\n");
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ファイルの内容を大文字に変換する

#include <stdio.h>
#include <ctype.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、大文字に変換して標準出力に表示する
  while ((ch = getc(fp)) != EOF) {
    putchar(toupper(ch));
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ファイルの内容を小文字に変換する

#include <stdio.h>
#include <ctype.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、小文字に変換して標準出力に表示する
  while ((ch = getc(fp)) != EOF) {
    putchar(tolower(ch));
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ファイルの内容を空白



ファイルから1文字ずつ読み込むその他の方法

fgetc()関数は、getc()関数とほぼ同じ機能を持つ関数です。getc()関数は標準入力からの読み込みにも使用できますが、fgetc()関数はファイルからのみ読み込むことができます。

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字ずつ読み込み、標準出力に表示する
  while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
  }

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

ungetc()関数は、読み込んだ文字をファイルポインタの前に戻す関数です。

#include <stdio.h>

int main() {
  FILE *fp;
  int ch;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルから1文字読み込む
  ch = getc(fp);

  // 読み込んだ文字をファイルポインタの前に戻す
  ungetc(ch, fp);

  // ファイルから1文字読み込み、標準出力に表示する
  ch = getc(fp);
  putchar(ch);

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

fread()関数は、ファイルからデータをバッファに読み込む関数です。

#include <stdio.h>

int main() {
  FILE *fp;
  char buf[1024];
  size_t n;

  // ファイルを開く
  fp = fopen("test.txt", "r");
  if (fp == NULL) {
    perror("fopen");
    return 1;
  }

  // ファイルからデータをバッファに読み込む
  n = fread(buf, 1, sizeof(buf), fp);

  // バッファの内容を標準出力に表示する
  fwrite(buf, 1, n, stdout);

  // ファイルを閉じる
  fclose(fp);

  return 0;
}

fscanf()関数は、ファイルから書式化されたデータを読み込む関数です。

#include <stdio.h>

int main() {
  FILE *fp;
  int