一、文件IO
文件IO的函数是由操作系统提供的,与操作系统绑定的,又称之为系统调用
文件IO是不带缓冲区的
文件IO是通过文件描述符来维护一个文件
1. 文件描述符
-
标准IO对文件的读写是通过流指针实现的。
-
文件IO对文件的读写是通过文件描述符实现的。
-
尝试打开一个文件的时候,系统会自动给这个文件分配一个编号(文件描述符),用这个编号来描述这个文件。
-
标准IO就是对文件IO的二次封装,在文件IO的基础上封装了一个缓冲区,同时会将文件描述符一起封装到FILE结构体中。
-
文件描述符的本质就是数组下标,该数组由系统定义,通过文件描述符可以找到指定的文件。
2. 特殊的文件描述符
特殊的流指针 | 特殊的文件描述符 | 数值 | 对应的宏 |
---|---|---|---|
stdin | stdin->_fileno | 0 | STDIN_FILENO |
stdout | stdout->_fileno | 1 | STDOUT_FILENO |
stderr | stderr->_fileno | 2 | STDERR_FILENO |
3. 文件描述符总量
文件描述符的编号:[0, 1023]。总量是1024个。
其中0,1,2分别对应,stdin stdout stderr;
注意:
每一个进程能打开的文件个数是有限的,在不使用的情况下,需要关闭。
getdtablesize()函数
功能:获取当前进程能打开的文件描述符总量;
头文件:
#include <unistd.h>
int getdtablesize(void);
二、常见的文件IO函数
1.常见的文件IO函数
open / close
read / write
lseek
2. 文件IO的使用
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);
参数:
char *pathname:指定要打开的文件路径+文件名;
int flags:文件的打开方式
O_RDONLY 只读
O_WRONLY 只写
O_RDWR 读写
---以上三种必须包含一种---
O_CREAT 如果文件不存在则创建一个普通文件
O_TRUNC 文件存在则清空文件
O_APPEND 追加的方式写;
w:O_WRONLY|O_TRUNC|O_CREAT;
mode_t mode:设置创建文件时候的文件权限,例如:0664 0775 0777,如果O_CREAT选项不存在,则忽略该参数;
返回值:
成功,返回文件描述符;
失败,返回-1,更新errno;
例子:
int fd = open("./open.txt", O_WRONLY|O_CREAT|O_TRUNC, 0664);
┌─────────────┬───────────────────────────────┐
│ fopen() mode │ open() flags │
├─────────────┼───────────────────────────────┤
│ r │ O_RDONLY │
├─────────────┼───────────────────────────────┤
│ w │ O_WRONLY | O_CREAT | O_TRUNC │
├─────────────┼───────────────────────────────┤
│ a │ O_WRONLY | O_CREAT | O_APPEND │
├─────────────┼───────────────────────────────┤
│ r+ │ O_RDWR │
├─────────────┼───────────────────────────────┤
│ w+ │ O_RDWR | O_CREAT | O_TRUNC │
├─────────────┼───────────────────────────────┤
│ a+ │ O_RDWR | O_CREAT | O_APPEND │
└─────────────┴───────────────────────────────┘
2)umask
1.什么是umask
文件权限掩码,会影响文件创建时候的权限;
2.umask的值
$ umask 结果是0002
3. 设置umask的值
方式1:在终端上设置,只在当前终端有效
$ umask 0 //将umask清零
方式2:通过umask()函数设置;
#include <sys/types.h>
#include <sys/stat.h>
mode_t umask(mode_t mask);
//将umask清空
umask(0);
3)close
功能:关闭文件;
头文件:
#include <unistd.h>
原型:
int close(int fd);
参数:
int fd:指定要关闭的文件描述符;
返回值:
成功,返回0;
失败,返回-1,更新errno;
4)write
功能:将数据写入到文件中;
头文件:
#include <unistd.h>
原型:
ssize_t write(int fd, const void *buf, size_t count);
参数:
int fd:文件描述符;
void *buf:指定要输出的数据首地址;注意可以是任意类型指针;
size_t count:指定要输出的数据大小,以字节为单位;
返回值ÿ