一、open()函数用于打开或创建文件,在打开或创建文件时可以指定文件的属性及用户的权限等各种参数
所需头文件:#include
#include
#include
函数原型:int open(const char *pathname, int flags, int perms)
函数传入值:pathname 被打开的文件名(可包括路径名)
flag:文件打开的方式
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以读写方式打开文件
O_CREAT:如果该文件不存在,就创建一个新的文件,并用第三个参数为其设置权限
O_EXCL:如果使用O_CREAT 时文件存在,则可返回错误消息。这一参数可测试文件是否存在。此时open 是原子操作,防止多个进程同时创建同一个文件
O_NOCTTY:使用本参数时,若文件为终端,那么该终端不会成为调用open()的那个进程的控制终端
O_TRUNC:若文件已经存在,那么会删除文件中的全部原有数据,并且设置文件大小为0。
O_APPEND:以添加方式打开文件,在打开文件的同时,文件指针指向文件的末尾,即将写入的数据添加到文件的末尾
perms:被打开文件的存取权限
可以用一组宏定义:S_I(R/W/X)(USR/GRP/OTH)
其中R/W/X 分别表示读/写/执行权限
USR/GRP/OTH 分别表示文件所有者/文件所属组/其他用户
例如,S_IRUSR | S_IWUSR 表示设置文件所有者的可读可写属
性。八进制表示法中600 也表示同样的权限
函数返回值:成功:返回文件描述符
失败:-1
二、close()函数用于关闭一个被打开的文件。当一个进程终止时,所有被它打开的文件都由内核自动关闭,很多程序都使用这一功能而不显示地关闭一个文件
所需头文件:#include
函数原型:int close(int fd)
函数输入值:fd:文件描述符
函数返回值 :0:成功
-1:出错
三、read()函数用于将从指定的文件描述符中读出的数据放到缓存区中,并返回实际读入的字节数。若返回0,、则表示没有数据可读,即已达到文件尾。读操作从文件的当前指针位置开始。当从终端设备文件中读出数据时,通常一次最多读一行
所需头文件:#include
函数原型:ssize_t read(int fd, void *buf, size_t count)
函数传入值:fd:文件描述符
buf:指定存储器读出数据的缓冲区
count:指定读出的字节数
函数返回值:
成功:读到的字节数
0:已到达文件尾
-1:出错
四、write()函数用于向打开的文件写数据,写操作从文件的当前指针位置开始。对磁盘文件进行写操作,若磁盘已满或超出该文件的长度,则write()函数返回失败。
所需头文件: #include
函数原型:ssize_t write(int fd, void *buf, size_t count)
函数传入值:fd:文件描述符
buf:指定存储器写入数据的缓冲区
count:指定读出的字节数
函数返回值:
成功:已写的字节数
-1:出错
五、lseek()函数用于在指定的文件描述符中将文件指针定位到相应的位置。它只能用在可定位(可随机访问)文件操作中。管道、套接字和大部分字符设备文件是不可定位的,所以在这些文件的操作中无法使用lseek()、调用
所需头文件:#include
#include
函数原型:off_t lseek(int fd, off_t offset, int whence)
函数传入值:fd:文件描述符
offset:偏移量,每一读写操作所需要移动的距离,单位是字节,可正可负(向前移,向后移)
whence:当前位置的基点
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小
函数返回值:
成功:文件的当前位移
-1:出错
函数使用举例:
#include
#include
#include
#include
#include
#include
int main()
{
int src_file, dest_file;
unsigned char buff[1024];
int real_read_len;
src_file = open("src_file", O_RDONLY);
dest_file = open("dest_file",O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);
if (src_file < 0 || dest_file < 0)
{
printf("Open file error\n");
exit(1);
}
lseek(src_file, -100, SEEK_END);
while ((real_read_len = read(src_file, buff, sizeof(buff))) > 0)
{
write(dest_file, buff, real_read_len);
}
close(dest_file);
close(src_file);
return 0;
}