C言語,ファイル書き込み,write

スポンサーリンク

鍛錬 16

C言語,ファイル書き込み,write

低水準入出力関数である write を用いて、ファイルへ書き込みを行う関数についてです。

関連記事:C言語,ファイル読み込み,read

スポンサーリンク

プログラム

以下のプログラム file_write.c は、write を用いてファイルへ書き込みを行います。

今回のプログラムでは、ファイル書き込み時に作成されるファイルのパーミッションを 644 に設定しています。

関連記事:C言語,ファイルパーミッション設定時のシンボル定数を8進数で表示

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

// preprocessor
#define FILENAME      "/var/tmp/sample.txt"
#define FILENAME_LEN  256
#define DATA          "abcdefg"
#define DATA_LEN      256

// prototype
int WriteXXXFile(char *filename, char *data);

// main
int main(void)
{
	char filename[FILENAME_LEN] = "";
	char data[DATA_LEN] = "";
	int ret;
	
	strncpy(filename, FILENAME, sizeof(filename) - 1);
	strncpy(data, DATA, sizeof(data) - 1);
	if ((ret = WriteXXXFile(filename, data)) == -1) {
		printf("ERROR,WriteXXXFile(),[%d]\n", ret);
		exit(EXIT_FAILURE);
	}
	
	printf("write data = %s\n", data);
	printf("write data len = %d\n", ret);
	
	return 0;
}

// =======================================
// @brief      ファイルにデータを書き込む
// @param[in]  filename  ファイル名
// @param[out] data      書込データ
// @return     len -> 書込データ長
// @return     -1  -> エラー
// @note       無し
// =======================================
int WriteXXXFile(char *filename, char *data)
{
	int len;
	int ret;
	int fd;
	
	if ((fd = open(filename, O_RDWR | O_TRUNC | O_CREAT,
				   S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
		perror("open");
		return -1;
	}
	
	len = strlen(data);
	if (((ret = write(fd, data, len)) == -1) || (ret != len)) {
		perror("write");
		close(fd);
		return -1;
	}
	fsync(fd);
	
	if ((ret = close(fd)) == -1) {
		perror("close");
		return -1;
	}
	
	return len;
}
スポンサーリンク

実行結果

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra file_write.c -o file_write
***@ubuntu:~/***/test/c$ ./file_write
write data = abcdefg
write data len = 7
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ cat /var/tmp/sample.txt
abcdefg

 
上記に示した通り、ファイル書き込みを行うことができました。

タイトルとURLをコピーしました