C 言語で open と fopen の比較

胡金庫 2023年10月12日
  1. C 言語でファイルを開いたり作成したりするために fopen 関数を使用する
  2. open 関数を用いて C 言語でファイルを開いたり作成したりする
  3. ファイルを開いて作成するには creat 関数を用いる
C 言語で open と fopen の比較

この記事では、C 言語で openfopen の関数を使用する方法を複数紹介します。

C 言語でファイルを開いたり作成したりするために fopen 関数を使用する

fopen はストリームオブジェクトとしてのファイルのオープンを扱うための C 標準ライブラリ関数です。関数が本質的にシステムコールである open とは対照的に、fopenFILE ポインタオブジェクトを与えられたファイルに関連付ける。第 1 引数はオープンするファイルのパス名を表し、第 2 引数はファイルを開くモードを表します。

第 1 引数はファイルを開くパス名を表し、第 2 引数はファイルを開くモードを表します。以下のコード例では、w+ モードを指定して、ファイルを読み書きできるように開き、内容を切り捨て、ストリームを先頭に配置します。与えられた関数パスが存在しない場合、呼び出しは書き込み用の新しいファイルを作成することに注意してください。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  FILE* output_file = fopen(filename, "w+");
  if (!output_file) {
    perror("fopen");
    exit(EXIT_FAILURE);
  }
  fwrite(str, 1, strlen(str), output_file);
  printf("Done Writing!\n");

  fclose(output_file);

  exit(EXIT_SUCCESS);
}

出力:

Done Writing!

open 関数を用いて C 言語でファイルを開いたり作成したりする

これに対して、open 関数は基本的には fopen が使われていても呼び出される下位レベルのシステムサービスです。システムコールは通常、C ライブラリのラッパー関数を使ってエンドユーザに提供されるが、C の stio ライブラリのものとは特性や性能の利用例が異なることに注意する必要があります。例えば、open は第 2 引数に int 型、オプションの第 3 引数には新規ファイル作成時のファイルモードビットを指定します。以下の例では、先ほどのサンプルコードと同様の機能を示しています。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_RDWR | O_CREAT);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

open は新しいファイルディスクリプタを作成し、その値を呼び出し元に返します。次のコード例では、オプションのモード引数に S_IRWXU を指定して open を呼び出しています。これらのシンボルは <fcntl.h> ヘッダで定義されているマクロであり、ファイルのパーミッションフラグを表しています。S_IRWXU はファイルの所有者が新たに作成されたファイルに対して読み書き実行権限を持つことを意味します。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = open(filename, O_CREAT | O_WRONLY | O_APPEND, S_IRWXU);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}

ファイルを開いて作成するには creat 関数を用いる

open に含まれるもう一つのシステムコールには creat 関数があり、これは新規ファイルを作成したり、ファイルが既に存在する場合には長さを 0 に切り捨てたりするために特別に利用することができます。この関数は本質的に open コールと同じで、O_CREAT | O_WRONLY | O_TRUNC という次の引数を持つことに注意してください。したがって、この関数は open と比べて 2つの引数を取るだけで、2 番目のフラグ引数を省略することができます。

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

const char* str = "Arbitrary string to be written to a file.\n";

int main(void) {
  const char* filename = "innn.txt";

  int fd = creat(filename, S_IRWXG);
  if (fd == -1) {
    perror("open");
    exit(EXIT_FAILURE);
  }

  write(fd, str, strlen(str));
  printf("Done Writing!\n");

  close(fd);

  exit(EXIT_SUCCESS);
}
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C File