C言語学習記録1 fgetc fputcを使ったファイル入出力

ファイルオープン

  char file_name[] = "myfile.txt";
  FILE *fp;
  if ((fp = fopen(file_name, "rb")) == NULL) {
    perror(file_name);
    return 1;
  }
オープンモード
オープンモード 意味 ファイルがあるとき ファイルがないとき
r 読み出し専用 正常 エラー(NULL返却)
w 書き込み専用 サイズを 0 にする(上書き) 新規作成
a 追加書き込み専用 最後に追加する 新規作成
r+ 読み込みと書き込み 正常 エラー(NULL返却)
w+ 書き込みと読み込み サイズを 0 にする(上書き) 新規作成
a+ 読み込みと追加書き込み 最後に追加する 新規作成

上記のテキストモードは環境依存の物理的な改行コードと '\n' を相互変換する
変換したくない場合はrb, wb, ab, r+b, w+b, a+bのバイナリモードを使用する

例外処理

fopenはファイルオープンに失敗した場合、戻り値としてNULLが返されます。ですので、ファイルオープンが失敗したことを通知してプログラムを終了させる必要があります。

ファイル読み込み

  char c;
  while (1) {
    c = fgetc(fp);
    if (ferror(fp)) {
      perror(file_name);
      fclose(fp);
      return 1;
    } else if (feof(fp)) {
      break;
    }
  }
例外処理

fgetc()はエラーが起こったかファイルの終わりに達した場合EOF(-1)を返す
どちらが起こったか判定するためにferror()関数とfeof()関数を使う

ferror()

エラーが起こって入れば0以外を返す

feof()

ファイルの終わりに達していれば0以外を返す

ファイルクローズ

  if (fclose(fp) == EOF) {
    perror(file_name);
    return 1;
  }
例外処理

fclose()は成功すると0を返し、エラーが起こるとEOF(-1)を返す

ファイルへの書き込み

書き込みモードwまたはwbでファイルをオープンします

  FILE *fp;
  char file_name[] = "myfile.txt";

  if ((fp = fopen(file_name, "wb")) == NULL) {
    perror(file_name);
    return 1;
  }

ファイルへ書き込みにはfputc関数を使用します

  char c;
  c = 'a';

  fputc(c, fp);
  if (ferror(fp)) {
    perror(file_name);
    fclose(fp);
    return 1;
  }

書き込みが終わったらファイルをクローズします

  if (fclose(fp) == EOF) {
    perror(file_name);
    return 1;
  }

ファイルの入れ替えを行うプログラム

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

int file_copy(char *file1, char *file2);

int main(int argc, char *argv[])
{
  char tmp_file[] = "/var/tmp/tmp_file.txt";

  if (argc != 3) {
    printf("<プログラム名> <ファイル1> <ファイル2>\n");
    exit(1);
  }

  if (file_copy(argv[1], tmp_file)) {
    return 1;
  }
  if (file_copy(argv[2], argv[1])) {
    return 1;
  }
  if (file_copy(tmp_file, argv[2])) {
    return 1;
  }

  return 0;
}

int file_copy(char *file1, char *file2)
{
  FILE *fp1, *fp2;
  char c;
  if ((fp1 = fopen(file1, "rb")) == NULL) {
    perror(file1);
    return 1;
  }
  if ((fp2 = fopen(file2, "wb")) == NULL) {
    perror(file2);
    fclose(fp1);
    return 1;
  }
  while (1) {
    c = fgetc(fp1);
    if (ferror(fp1)) {
      perror(file1);
      fclose(fp1);
      fclose(fp2);
      return 1;
    } else if (feof(fp1)) {
      break;
    }
    fputc(c, fp2);
    if (ferror(fp2)) {
      perror(file2);
      fclose(fp1);
      fclose(fp2);
      return 1;
    }
  }
  if (fclose(fp1) == EOF) {
    perror(file1);
    fclose(fp2);
    return 1;
  }

  if (fclose(fp2) == EOF) {
    perror(file2);
    return 1;
  }
  return 0;
}

実行結果