目录
文件IO
1.概念
在posix(可移植操作系统接口)中定义的一组输入输出的函数
2.特点
- 没有缓冲机制,每次操作都会经过系统调用,效率比较低
- 围绕文件描述符,文件描述符是非负整数,0、 1、 2
- 默认打开三个文件描述符,0(标准输入)、1(标准输出)、2(标准错误)
- 除目录外其他任意类型文件都可以操作
3.函数
man 3
3.1打开文件
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, ...);
功能:打开文件
参数:pathname:文件路径名
flags:打开文件的方式
O_RDONLY:只读
O_WRONLY:只写
O_RDWR:可读可写
O_CREAT:创建
O_TRUNC:清空
O_APPEND:追加
返回值:成功:文件描述符
失败:-1
示例:
当第二个和参数存在O_CREAT,我们就需要写第三个参数:你要创建文件的权限
实际文件权限计算方式:指定的权限值 & (~umask)
补充:
- 当第二个参数中有O_CREAT选项时,需要给open函数传递第三个参数,指定创建文件的权限 ,open(file, xx|O_CREAT|xx, 0666);
- 实际创建出来的文件权限为:指定权限值&(~umask) //umask为文件权限掩码,通过umask命令可以查看
- 打开文件方式对应表:
标准IO | 文件IO |
r | O_RDONLY |
r+ | O_RDWR |
w | O_WRONLY|O_CREAT|O_TRUNC |
w+ | O_RDWR|O_CREAT|O_TRUNC |
a | O_WRONLY|O_CREAT|O_APPEND |
a+ | O_RDWR|O_CREAT|O_APPEND |
3.2关闭文件
int close(int fd);
参数:fd:文件描述符
示例:
3.3读写文件
read
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:从一个已打开的可读文件中读取数据
参数:fd 文件描述符
buf 存放位置
count 期望的个数
返回值:成功:实际读到的个数
返回-1:表示出错,并设置errno号
返回0:表示读到文件结尾
示例:
write
ssize_t write(int fd, const void *buf, size_t count);
功能:向指定文件描述符中,写入 count个字节的数据。
参数:fd 文件描述符
buf 要写的内容
count 期望值
返回值:成功:实际写入数据的个数
失败 : -1
示例:
补充:在读和写一起使用时,一般write的字符个数指定为read的返回值,“读多少写多少”
4.文件定位操作
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
功能:设定文件的偏移位置
参数:fd:文件描述符
offset偏移量
正数:向文件结尾位置移动
负数:向文件开始位置
whence 相对位置
SEEK_SET 开始位置
SEEK_CUR 当前位置
SEEK_END 结尾位置
返回值:成功:文件的当前位置
示例:
5.重定向打开文件
FILE * freopen(const char *pathname, const char *mode, FILE* fp)
功能:将指定的文件流重定向到打开的文件中
参数:path:文件路径
mode:打开文件的方式(同fopen)
fp:文件流指针
返回值:成功:返回文件流指针
失败:NULL