目录
1、open函数
所需头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
两种写法
int open(const char*pathname,int flags);
int open(const char*pathname,int flags,mode_t mode);
返回值:成功则返回文件描述符,否则返回-1
函数参数:
pathname:指向想要打开的文件路径名,或者文件名。我们需要注意的是,这个路径名是绝对路径名。文件名则是在当前路径下的。
flags:用来控制打开文件的模式
打开文件的方式,以下三种方式必须其一:
O_RDONLY:以只读方式打开文件
O_WRONLY:以只写方式打开文件
O_RDWR:以可读可写的方式打开文件
其余的,和上面的进行或运算:
O_CREAT:如果文件不存在,则创建文件,但同时必须使用第三个参数
O_EXCL:如果文件存在,则出错
O_NOCTTY: 使用本参数时,如文件为终端,那么终端不可以作为调用open()系统调用的那个进程的控制终端
O_TRUNC:如果文件存在,则清空文件中的内容
O_APPEND:文件存在,则追加在文件的末尾
mode:用来设置创建文件的权限(rwx),用一个八进制数表示。当flags中带有O_CREAT时,需要去创建一个新的文件,才需要去设置权限。
2、close函数
头文件:#include <unistd.h>
int close(int fd);
参数:已打开的文件的文件描述符
返回值:成功返回0,失败返回-1
3、read函数
头文件:#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:将从fd所描述的文件中的内容读出,并放入以buf地址开始的一片空间中,count是每次要读的字节数
参数1:文件描述符
参数2:读取到数据保存到buf中
参数3:要读的字节数
返回值:成功读取每次返回读到的字节数,返回0表示已经读完,失败返回-1
4、write函数
头文件:#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:将以buf地址开始的那片空间中的内容,写入到以fd描述的文件中去,每次写入count个字节数
参数1:文件描述符
参数2:要写入的数据存在的首地址
参数3:要写入的字节数(只要count设置的合适,用sizeof,可以一次写完)
返回值:成功返回写入的字节数count,失败返回-1
5、案例(模拟CP)
利用文件IO各函数进行两个文本之间的copy,模拟了虚拟机下的CP命令,此案例对学习文件IO各函数帮助很大,涵盖了各个函数,以下附上程序,读者可以参考学习
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(int argc , char *argv[])
{
//打开文件1,并进行打开成功与否的检测,文件1当是已经有数据存在了的,开的权限是可读
int fr = open(argv[1],O_RDONLY);
if(fr < 0)
{
perror("open error");
return -1;
}
//打开文件2,检测,文件2是待赋值写入的空文本,所以开的权限是可写
int fw = open(argv[2],O_WRONLY);
if(fw < 0)
{
perror("open error");
return -1;
}
//文件操作
char buf[1024] = {0};
while(1)
{
memset(buf,0,sizeof(buf)); //保险起见,每次清空一下
int n = read(fr,buf,sizeof(buf));
if(0 == n)
{
break;
}
else if(n == -1)
{
printf("read error\n");
}
write(fw,buf,sizeof(buf));
}
//关闭文件
close(fr);
close(fw);
return 0;
}
说明:双向箭头表示等价调用,黄色箭头表示数据的流向,buf可以视为一个中间器,在读取出来的时候暂时存一下,之后又写入其他地方