文章目录
- [1. 文件描述符](#1. 文件描述符)
- [2. 文件IO常用函数](#2. 文件IO常用函数)
- 2.1打开文件:open
- [2.2 关闭文件:close](#2.2 关闭文件:close)
- [2.3 读写操作:read/write](#2.3 读写操作:read/write)
- [2.4 关于光标的操作:lseek](#2.4 关于光标的操作:lseek)
1. 文件描述符
- 文件描述符的本质是一个大于等于0的整数,在使用
open
函数打开文件时,就会产生一个用于操作文件的句柄,这就是文件描述符。 - 在一个进程中,能够打开的文件描述符是有限制的,一般是1024个,[0,1023],可以通过指令
ulimit -a
进行查看,如果要更改这个限制,可以通过指令ulimit -n
数字,进行更改。 - 文件描述符的使用原则一般是最小未分配原则。
- 特殊的文件描述符:0、1、2,这三个文件描述符在一个进程启动时就默认被打开了,分别表示标准输入、标准输出、标准错误
2. 文件IO常用函数
2.1打开文件:open
- 函数介绍:
cpp
#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:要打开的文件文件路径
参数2:打开模式 以下三种方式必须选其一:O_RDONLY(只读)、O_WRONLY(只写)、O_RDWR(读写)
除了上面三个参数之外,以下的打开方式可以有零个或多个,跟上述的方式一起用位或运算连接到一起。
O_CREAT:用于创建文件,如果文件不存在,则创建文件,如果文件存在,则打开文件,
如果flag中包含了该模式,则函数的第三个参数必须要加上。
O_APPEND:以追加的形式打开文件,光标定位在结尾。
O_TRUNC:清空文件。
O_EXCL:常跟O_CREAT一起使用,确保本次要创建一个新文件,如果文件已经存在,则open函数报错。
参数3:如果参数2中的flag中有O_CREAT时,表示创建新文件,参数3就必须给定,表示新创建的文件的权限。
如果当前参数给定了创建的文件权限,最终的结果也不一定是参数3的值。
系统会用你给定的参数3的值,与系统的umask取反的值进行位与运算后,才是最终创建文件的权限,
即:(mode & (~umask))
返回值:成功返回打开文件的文件描述符,失败返回-1并置位错误码。
*/
普通文件的权限一般为:0644,表示当前用户没有可执行权限,当前组中其他用户和其他组中的用户都只有读权限;目录文件的权限一般为:0755,表示当前用户具有可读、可写、可执行,当前组中其他用户和其他组中的用户都没有可写权限。
注意:如果不给权限,那么当前创建的权限会是一个随机值。
补充1:Linux下文件权限相关内容(包含对数字的解释)
补充2:fopen()
与open()
对应参数
2.2 关闭文件:close
- 函数介绍:
cpp
#include <unistd.h>
int close(int fd);
/*
功能:关闭文件描述符对应的文件
参数:文件描述符
返回值:成功返回0,失败返回-1并置位错误码
*/
- 示例代码:
cpp
#include<myhead.h>
int main(int argc, const char *argv[])
{
//1、定义文件描述符,对于文件IO而言,句柄就是文件描述符
int fd = -1; //以只读的形式创建文件,如果文件不存在则创建文件
//如果创建文件时没有给权限,则该文件的权限是随机权限
//如果创建文件时,给定了文件的权限,则文件最终的权限是 给定的 mode & (~umask)
if((fd = open("./tt.txt", O_WRONLY|O_CREAT, 0644)) == -1)
{
perror("open error");
return -1;
}
printf("open success fd = %d\n", fd); //3,由于0、1、2已经被使用,所以该数为3
//关闭文件
close(fd); //关闭fd引用的文件
return 0;
}
2.3 读写操作:read/write
函数介绍:
cpp
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
/*
功能:从fd文件描述符引用的文件中读取count的字符放入buf对应的容器中
参数1:已经打开文件对应的文件描述符
参数2:容器的起始地址
参数3:要读取的字符个数
返回值:成功返回读取的字符个数,这个个数可能会小于count的值,失败返回-1并置位错误码
*/
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
/*
功能:将buf容器中的count个数据,写入到fd引用的文件中
参数1:已经打开的文件的文件描述符
参数2:要写入的数据的起始地址
参数3:要写入数据的个数
返回值:成功返回写入的字符个数,这个个数可能小于count,失败返回-1并置位错误码
*/
2.4 关于光标的操作:lseek
函数介绍:
cpp
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
/*
功能:移动光标的位置,并返回光标现在所在的位置
参数1:文件描述符
参数2:偏移量
>0:表示从指定位置向后偏移n个字节
><0:表示从指定位置向前偏移n个字节
>=0:在指定位置处不偏移
参数3:偏移的起始位置
SEEK_SET:文件起始位置
SEEK_CUR:文件指针当前位置
SEEK_END:文件结束位置
返回值:光标现在所在的位置
*/