次のインタフェースは、ファイルとキャラクタ入出力デバイス上で基本的な操作を実行します。
表 5–1 基本的なファイル入出力インタフェース
インタフェース名 |
目的 |
---|---|
open(2) | 読み取りまたは書き込み用にファイルを開く |
close(2) | ファイル記述子を閉じる |
read(2) | ファイルから読み取る |
write(2) | ファイルに書き込む |
creat(2) | 新しいファイルを作成するか、既存のファイルに上書きする |
unlink(2) | ディレクトリエントリを削除する |
lseek(2) | 読み取りまたは書き込み用のファイルポインタを移動する |
次のコード例は、基本的なファイル入出力インタフェースの使用方法を示します。read(2) と write(2) はどちらも、現在のファイルのオフセットから指定された数を超えないバイト数を転送し、実際に転送されたバイト数が返されます。read(2) では、ファイルの終わりは戻り値が 0 になります。
#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 の使い方を示します。
off_t start, n; struct record rec; /* 現在のオフセットの位置をstart に設定する */ start = lseek (fd, 0L, SEEK_CUR); /* start に戻る */ n = lseek (fd, -start, SEEK_SET); read (fd, &rec, sizeof (rec)); /* 前のレコードをリライトする */ n = lseek (fd, -sizeof (rec), SEEK_CUR); write (fd, (char *&rec, sizeof (rec));