文章目录
1. 回忆c语言的文件操作接口
1.1 fopen
FILE *fopen(const char *path, const char *mode);
path:带路径的文件名称(待打开的文件)
mode:
r:以可读方式打开,文件不存在则报错
r+:以可读方式打开,不可写,文件不存在,则报错
w以可写方式打开,但是不能读,文件不存在则创建,文件存在则截断(清空文件内容)文件。
w+:以读写方式打开,文件不存在,则创建,文件存在,则截断(清空文件内容)文件。
a:追加写,不能读,在文件末尾进行追加写,文件不存在则创建文件。文件存在,则在文件的末尾开始写。
a+:可读追加写,不能读。在文件末尾进行追加写,文件不存在则创建文件,文件存在,则在文件的末尾开始写。
返回值:文件流指针FILE
1.2 fclose
int fclose(FILE *fp);
关闭文件流指针
1.3 fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
ptr:要将文件读到的保存到哪里去,ptr保存用户准备的一个空间(缓冲区)的地址。
size:块的大小,单位是字节
nmemb:块的个数
eg:size = 2 nmemb = 5 ==>10
常见的用法:size = 1,nmemb可以指定任意块,读到的字节数量也就是可以用nmemb表示了
stream:文件流指针,表示要从哪里进行读
返回值:返回的是读到的块的个数
1.4 fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
ptr:要写入到文件当中的内容
size:块的大小,单位字节
nmemb:块的个数
总写入的字节数量 = 块的大小 * 块的个数
stream:文件流指针
返回值:写入块的个数
1.5 fseek
int fseek(FILE *stream, long offset, int whence);
stream:文件流指针
offset:偏移量,单位字节。相当于whence而言的偏移量
whence:
SEEK_SET:文件的头部
SEEK_CUR:当前文件流指针的位置
SEEK_END:文件的尾部
2. 系统调用文件接口
2.1 open
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
pathname:待打开的文件
flags:
O_RDONLY:只读方式
O_WRONLY:只写方式
O_RDWR:读写方式
上面这三个有且只有一个,相互是互斥的
O_CREAT:文件不存在则创建,需要告知权限,使用8进制数字表示
O_TRUNC:截断文件(清空文件)
O_APPEND:追加
上面这三个可以组合使用,组合使用的方式为:按位或
eg:O_WRONLY|O_CREAT|O_TRUNC
返回值:
返回一个正整数,含义为文件描述符
1.为什么需要按位或?
#define O_RDONLY 00000000
#define O_CREAT 00000100
#define O_RDWR 00000002
上面的均为8进制数字,这些属性按照位图的方式来进行使用,如果想要某一个属性,则使用按位与的方式,将对应的比特位设置为1;
fcntl函数:获取文件描述符的属性
fcntl(fd,F_GETFL);
属性通过返回值返回
2.文件描述符是啥?
默认打开的标准输入,标准输出,标准错误,文件描述符本质上就是一个小整数。
2.2 close
2.3 read
fd:文件描述符
buf:将读到的内容放到buf这个缓冲区当中
count:表示最大能够读多少字节,和buf的大小有关系,需要在buf当中预留一个\0的位置。
返回值:
>0: 读到的字节数量
- 1:读失败了
2.4 write
fd:文件描述符
buf:写到文件当中的内容
count:写入的字节数量
返回值
>0:表示写入文件真实的字节数量
-1:写入失败了
2.5 lseek
fd:文件描述符
offset:偏移量
whence:
SEEK_SET
SEEK_CUR
SEEK_END
3. 文件描述符&文件流指针
文件描述符就是内核当中fd_array数组的下标,是一个正整数
文件描述符的分配规则:
最小位占用原则
一个进程最大可以打开多少个文件描述符?
命令:ulimit -a
更改:ulimit -n