前言:
UNIX系统中绝大多数文件I/O会用到五个函数,分别是open、read、write、lseek、close。
函数操作:
1、open函数
头文件:#include<fcntl.h>
函数原型:int open(const char *path, int oflag,........)
参数说明: path:一般指需要打开或者创建的文件名字
oflag:常用的标志(O_RDONLY、O_WRONLY、O_RDWR、O_CRAET、O_TRUNC)
2、close函数
头文件:#include<unistd.h>
函数原型:int close(int fd)
参数说明:fd:需要关闭的文件描述符
3、lseek函数
头文件:#include<unistd.h>
函数原型:off_t lseek(int fd, off_t offset, int whence)
参数说明:fd: 需要操作文件的文件描述符
offset:与whence有关具体如下:
whence = SEEK_SET 文件的偏移量设置位距文件的开始处的offset个字节
whence = SEEK_CUR 文件的偏移量设置为当前值加上offset个字节
whence = SEEK_END 将文件的偏移量设置成文件长度加上offset个字节
返回值:返回新的文件偏移量
4、read函数
头文件:#include<unistd.h>
函数原型:ssize_t read(int fd, void *buf, size_t nbytes )
参数说明:fd: 需要读取文件的文件描述符
buf:读取的数据存入buf中
nbytes:需要读取的字节数
5、write函数
头文件:#include<unsitd.h>
函数原型:ssize_t write(int fd, void *buf, size_t nbytes)
参数说明:fd: 需要写入文件的文件描述符
buf:存储需要写数据的buf
nbytes:需要写入文件的字节数
函数的综合用法:拷贝文件
#include<stdio.h>
#include <fcntl.h>
#include <unistd.h>
//c 语言入口
int main(int argc, char ** argv)
{
if(argc != 3) {
fprintf(stderr, "Usage: %s src_file des_file\n", argv[0]);
return -1;
}
int fdr; //读文件描述符号;
int fdw; //写文件描述符号;
fdr = open(argv[1], O_RDONLY); //以只读的方式打开
if(-1 == fdr) {
perror("open");
return -1;
}
fdw = open(argv[2], O_WRONLY | O_CREAT | O_TRUNC, 0644); //只写的方式打开,如果没有文件就创建
if(-1 == fdw) {
perror("open");
close(fdr);
}
int ret;
char buf[1024 * 1024] ;
memset(buf, 0, 1024*1024);
while(1) {
ret = read(fdr, buf, 1024 * 1024);
if(-1 == ret) {
perror("read");
close(fdr);
}
if(0 == ret)
break;
ret = write(fdw, buf, ret);
if(-1 == ret) {
perror("write"); close(fdw);
}
}
close(fdr);
close(fdw);
return 0;
}