之前介绍了IO库函数,本文主要介绍系统提供的IO接口,与IO库函数搭配食用效果更佳。
系统调用接口
常使用的IO系统调用接口如下:
接口 | 作用 |
---|---|
open | 打开指定的文件 |
write | 向指定的文件写入数据 |
read | 从指定的文件读取数据 |
lseek | 跳转指定文件的读写位置 |
close | 关闭指定文件 |
文件描述符
系统调用IO接口的操作离不开文件描述符,那么什么是文件描述符?
在IO库函数中,操作一个文件使用的是文件流指针,可以说文件流指针就是文件的操作句柄。操作句柄就是用来操作东西的手柄,就像操控电视的遥控器一样。
IO库函数其实就是对IO接口的封装,将IO接口中的文件描述符封装后就变成了文件流指针,因此文件描述符就是IO接口中文件的操作句柄。
一、open
int open(const char *pathname, int flags, mode_t mode)
作用:用指定方式打开指定文件
- const char *pathname:要打开的文件名(带路径)
- int flags:文件的打开方式
- mode_t mode:文件不存在时创建文件所使用的权限(这里要注意文件掩码的问题)
返回值:成功返回一个非负整数(就是文件描述符),失败返回-1。
flags选项(前三种必须选择一个):
- O_RDONLY:只读
- O_WRONLY:只写
- O_RDWR:可读可写
- O_CREAT:文件不存在就创建
- O_APPEND:写入数据时以追加方式写
- O_TRUNC:打开文件时清空
二、write
ssize_t write(int fd, const void *buf, size_t count)
作用:向指定文件写入指定大小的数据。
- int fd:要向哪个文件写入数据,就传入哪个文件的文件描述符
- const void *buf:要向文件写入的数据的首地址
- size_t count:要写入的数据的字节长度
返回值:成功返回实际写入文件的数据长度,失败返回-1
三、read
ssize_t read(int fd, void *buf, size_t count)
作用:从指定文件读取指定大小的数据。
- int fd:要从哪个文件读出数据,就传入哪个文件的文件描述符
- void *buf:存储读取到的数据的空间首地址
- size_t count:要读取的数据长度,以字节为单位
返回值:成功返回实际读取到的数据的长度,出错返回-1
四、lseek
off_t lseek(int fd, off_t offset, int whence)
作用:跳转读写位置
- int fd:文件的操作句柄
- off_t offset:偏移量
- int whence:从哪里开始偏移
返回值:成功返回当前跳转后的位置相对于起始位置的偏移量,出错返回-1
whence选项:
- SEEK_SET:起始位置
- SEEK_CUR:当前读写位置
- SEEK_END:末尾位置
五、close
int close(int fd)
作用:关闭文件
- int fd:要关闭的文件的文件描述符