システムインタフェース

基本ファイル入出力

表 5-1 に示している関数は、ファイルで基本操作を実行します。

表 5-1 基本的なファイル入出力関数

関数名 

目的 

open(2)

読み取りまたは書き込み用にファイルを開く。 

close(2)

ファイル記述子を閉じる。 

read(2)

ファイルから読み取る。 

write(2)

ファイルに書き込む。 

creat(2)

新しいファイルを作成するか、既存のファイルに上書きする。 

unlink(2)

ディレクトリエントリを削除する。 

lseek(2)

読み取り / 書き込み用のファイルポインタを移動する。 

次のコード例は、基本的なファイル入出力インタフェースの使用方法を示します。read(2)write(2) はどちらも、現在のファイルのオフセットから指定された数を超えないバイト数を転送します。実際に転送されたバイト数が戻されます。ファイルの終わりでは、read(2) の戻り値が 0 になります。


例 5-1


#include			<fcntl.h>
#define			MAXSIZE			256

main()
{
 	int		fd;
		ssize_t	n;
 	char		array[MAXSIZE];
		

 	fd = open ("/etc/motd", O_RDONLY);
 	if (fd == -1) {
 		perror ("open");
 		exit (1);
 	}
 	while ((n = read (fd, array, MAXSIZE)) > 0)
 		if (write (1, array, n) != n)
 			perror ("write");
 	if (n == -1)
 		perror ("read");
 	close (fd);
}

読み取りまたは書き込みを完了したら、必ずファイルを閉じて (close(2)) ください。開いて (open(2)) いないファイル記述子を閉じて (close(2)) はなりません。

開いているファイル内のオフセットは、read(2)write(2)、または lseek(2) を呼び出すことによって変更されます。次に lseek(2) の使用例を示します。


off_t		start, n;
 struct		record		rec;

 /* 現在のオフセットの位置をスタートにセットする */
 start = lseek (fd, 0L, SEEK_CUR);

 /* スタートに戻る */
 n = lseek (fd, -start, SEEK_SET);
 read (fd, &rec, sizeof (rec));

 /* 前のレコードをリライトする */
 n = lseek (fd, -sizeof (rec), SEEK_CUR);
 write (fd, (char *&rec, sizeof (rec));