C言語,pwrite()関数で指定した位置からデータを書き込む

スポンサーリンク

鍛錬 826

C言語,pwrite()関数で指定した位置からデータを書き込む

オフセットを指定して(書き込み開始位置を指定して)データをファイルに書き込む方法の一つとして、pwrite()関数を使用する方法があります。

指定したオフセットから指定したバイト数だけ書き込むことも可能です。
 
以下は、pwrite()関数についてです。

#include <unistd.h>

ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset);
 

 
書き込み後、ファイルのオフセットは変化しません。

引数

以下は、上記の引数についてです。

引数 意味
int fd ファイルディスクリプタ
const void *buf 書き込みデータ
size_t count 書き込むバイト数
off_t offset 書き込みを開始する、ファイル先頭からのオフセット(位置)

戻り値

以下は、戻り値についてです。

戻り値
ssize_t 成功した場合 書き込んだバイト数
ssize_t エラーの場合 -1
 
スポンサーリンク

プログラム

以下は、書き込み位置を指定してファイルにデータを書き込むプログラム、test_pwrite.c です。

今回は、ファイル sample.txt にデータを書き込みます。

sample.txt のデータ(書き込み前)
cccccc
1回目の書き込み
4文字目から6文字を書き込み ccc******
2回目の書き込み
3文字目から3文字を書き込み cc***c
// include
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// main
int main(void)
{
	char filename[256] = "";
	char data[256] = "";
	int fd;
	int ret;
	size_t st_len;
	ssize_t sst_ret;
	
	// ファイル名を格納
	strncpy(filename, "sample.txt", sizeof(filename) - 1);
	
	// ファイルオープン
	if ((fd = open(filename, O_RDWR | O_TRUNC | O_CREAT,
				   S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1) {
		perror("open");
		return -1;
	}
	
//---------------------------------------------------------
	system("echo -n \"cccccc\" > sample.txt");
	printf("---------------------------\n");
	printf("書き込み前\n");
	system("cat sample.txt");
	printf("\n");
//---------------------------------------------------------
	
	// 4文字目から6文字を書込
	// cccccc
	// 012345678
	//    AAAAAA
	strncpy(data, "AAAAAA", sizeof(data) - 1);
	st_len = strlen(data);
	sst_ret = pwrite(fd, data, st_len, 3);
	if (sst_ret == -1) {
		perror("pwrite");
		close(fd);
		exit(EXIT_FAILURE);
	}
	else if ((sst_ret >= 0) && ((size_t)sst_ret != st_len)) {
		printf("ERROR,pwrite(),ret=%ld\n", sst_ret);
		close(fd);
		exit(EXIT_FAILURE);
	}
	printf("4文字目から6文字を書き込み後\n");
	system("cat sample.txt");
	printf("\n");
	
//---------------------------------------------------------
	system("echo -n \"cccccc\" > sample.txt");
	printf("---------------------------\n");
	printf("書き込み前\n");
	system("cat sample.txt");
	printf("\n");
//---------------------------------------------------------
	
	// 3文字目から3文字を書込
	// cccccc
	// 012345
	//   AAA
	strncpy(data, "AAA", sizeof(data) - 1);
	st_len = strlen(data);
	sst_ret = pwrite(fd, data, st_len, 2);
	if (sst_ret == -1) {
		perror("pwrite");
		close(fd);
		exit(EXIT_FAILURE);
	}
	else if ((sst_ret >= 0) && ((size_t)sst_ret != st_len)) {
		printf("ERROR,pwrite(),ret=%ld\n", sst_ret);
		close(fd);
		exit(EXIT_FAILURE);
	}
	printf("3文字目から3文字を書き込み後\n");
	system("cat sample.txt");
	printf("\n");
	
	// ファイルクローズ
	if ((ret = close(fd)) == -1) {
		perror("close");
		return -1;
	}
	
	return 0;
}

実行結果

以下は、プログラム test_pwrite.c を実行しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra test_pwrite.c -o test_pwrite
***@ubuntu:~/***/test/c$ ./test_pwrite
---------------------------
書き込み前
cccccc
4文字目から6文字を書き込み後
cccAAAAAA
---------------------------
書き込み前
cccccc
3文字目から3文字を書き込み後
ccAAAc

 
上記に示した通り、書き込み開始位置を指定してファイルにデータを書き込むことができました。

スポンサーリンク

シェアする

フォローする