テクノロジーの雑学・豆知識

PC・スマホ、プログラミング、電子機器、電化製品についての雑学・うんちく・豆知識・トリビアを集めたサイトです。気になった記事や文章を個人のメモとして投稿しています

【C言語文例】ファイルをオープンするopen()の使い方

ヘッダ fcntl.h、sys/types.h、sys/stat.h
書式 int open(const char *path, int mode, [mode_t creat_mode])
引数 path … ファイル名
mode … オープンするファイルに許可を与えるモード
creat_mode … modeにO_CREATを指定した場合に設定できるオープンするファイルのモード(省略可能)


modeで設定できる値は、下記「※1」の3つのいずれか1つと、「※2」の任意の値を「|(論理和)」で結んだものとなる。

※1
O_RDONLY 読み込み可
O_WRONLY 書き込み可
O_RDWR 読み書き可

※2
O_APPEND ファイルポインタをファイルの最後に移動する
O_CREAT ファイルを生成する
O_TRUNC ファイルが存在する場合、サイズを0にする
O_BINARY バイナリモード
O_TEXT テキストモード


modeにO_CREATを指定した場合、3番目の引数で「※3」のcreat_modeを指定できる。

※3
S_IWRITE 読み書き可
S_IREAD 読み込み可
S_IREAD | S_IWRITE 読み書き可
戻り値 成功:ファイルデスクリプタ(そのファイルを一意に識別できる数値)
失敗:-1
解説 ファイルをオープンし、ファイルデスクリプタを返却する低水準入出力関数。

 

<サンプルプログラム>

/****************************************************************************/
#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>

#define BUF_SIZE 512

int main(void)
{
// 変数定義
int fd1, fd2;
int byte_num;
char buf[BUF_SIZE];

// 変数初期化
fd1 = 0;
fd2 = 0;
byte_num = 0;
memset(buf, '\0', BUF_SIZE);

// ファイルのオープン
fd1 = open("./file1", O_RDONLY); // 読み込み専用でファイルを開く
fd2 = open("./file2", O_WRONLY); // 書き込み専用でファイルを開く

if(fd1 == -1 || fd2 == -1) // ファイルオープン失敗
{
fprintf(stdout, "ファイルオープンエラー\n");
return 1;
}

// ファイルから5バイト読み込み
byte_num = read(fd1, &buf[0], 5); // ファイルから5バイト読み込み

if(byte_num == -1) // ファイル読み込み失敗
{
fprintf(stdout, "ファイル読み込みエラー\n");
return 1;
}

fprintf(stdout, "file1から%dバイト読み込みました。\n", byte_num);
fprintf(stdout, "読み込んだ文字列:%s\n", buf);

// ファイルへ3バイト書き込み
byte_num = write(fd2, &buf[0], 3);

if(byte_num == -1) // ファイル書き込み失敗
{
fprintf(stdout, "ファイル書き込みエラー\n");
return 1;
}

fprintf(stdout, "file2から%dバイト書き込みました。\n", byte_num);
buf[byte_num] = '\0';
fprintf(stdout, "書き込んだ文字列:%s\n", buf);

// ファイルを閉じる
close(fd1);
close(fd2);

return 0;
}
/****************************************************************************/

<使用ファイル>

プログラムで使用するfile1.txtの内容(10バイト)
--------------------------
abcdefghij
--------------------------


<実行結果>