C 言語で open と fopen の比較
-
C 言語でファイルを開いたり作成したりするために
fopen
関数を使用する -
open
関数を用いて C 言語でファイルを開いたり作成したりする -
ファイルを開いて作成するには
creat
関数を用いる
この記事では、C 言語で open
と fopen
の関数を使用する方法を複数紹介します。
C 言語でファイルを開いたり作成したりするために fopen
関数を使用する
fopen
はストリームオブジェクトとしてのファイルのオープンを扱うための C 標準ライブラリ関数です。関数が本質的にシステムコールである open
とは対照的に、fopen
は FILE
ポインタオブジェクトを与えられたファイルに関連付ける。第 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);
}