大多数情况下,我们都会利用Standard I/O Library来进行I/O操作,而这一章所讲的I/O是UNIX系统直接提供的I/O操作,且大多是Unbuffered I/O,即每一次读或写都会出现一次系统调用。
1、打开文件
#include <fcntl.h> int open(const char *pathname, int oflag, .../* mode_t mode */);
参数oflag有多个选择如O_RDONLY(只读), O_WRONLY(只写), O_RDWR(读写), O_APPEND(每次写都写在文件的最后), O_CREAT(文件不在时创建)......其中前三个必选一个,其余可挑选。多个oflag参数用|分开,如:
open(pathname, O_RDWR | O_CREAT | O_TRUNC, mode);
第三个参数用“...”表示剩下的参数数目和类型可变,事实上只有当文件被创建的时候,参数mode才会有意义,它决定新文件的属性。
2、创建文件
#include <fcntl.h> int creat(const char *pathname, mode_t mode);
当创建新文件的同时也会把该文件打开,并且以只写的方式打开,等价于:
open(pathname, O_WRONLY | O_CREAT | O_TRUNC, mode);
这样当我们要对新文件既读又写的时候,只能依次调用creat,close,open。因此当我们需要对新文件既读又写的时候,常常会用到以下方式代替:
open(pathname, O_RDWR | O_CREAT | O_TRUNC, mode);
3、lseek
每个打开的文件都会有一个当前偏移量来衡量当前处于距离文件开头的哪个位置。