文件I/O简介
文件I/O就是文件读写,Linux下一切皆文件,熟练掌握文件I/O非常有必要。
文件I/O“四大金刚”:open、read、write、lseek。
文件描述符:调用open可获得文件对应的文件描述符fd,调用read/write/lseek都需要用到文件描述符。
函数名 |
open |
read |
write |
lseek |
作用 |
打开/创建文件 |
读文件 |
写文件 |
重新定位读写位置 |
文件I/O原理图
打开/创建文件:
int open(const char *pathname, int flags);
int open(const char *path, int oflags,mode_t mode);
需要包含的头文件:<sys/types.h>、<sys/stat.h>、<fcntl.h>
返回值:成功返回文件描述符,失败返回-1
参数 |
path |
oflags |
mode |
说明 |
路径名或者文件名,使用绝对路径 |
配置标志位,可同时用多个标志位 |
oflags包含O_CREATE时必须配置,用来设定文件的访问权限 |
可选参数 |
/ |
O_RDONLY:只读打开 O_WRONLY:只写打开 O_ROWR:读写打开 O_CREATE:如果文件不存在,创建文件 O_EXCL:搭配O_CREATE使用,检查文件是否存在,存在的话返回错误 |
S_IRUSR:文件所有者可读 S_IWUSR:文件所有者可写 S_IXUSR:文件所有者可执行 S_IRWXU:文件所有者可读+写+执行 S_IRGRP:文件所有者的同组者可读 S_IWGRP:文件所有者的同组者可写 S_IXGRP:文件所有者的同组者可执行 S_IRWXG:文件所有者的同组者可读+写+执行 S_IROTH:其他用户可读 S_IWOTH:其他用户可写 S_IXOTH:其他用户可执行 S_IRWXO:其他用户可读+写+执行 |
读取文件:
ssize_t read(int fildes, void *buf, size_t nbyte);
需要包含的头文件:<unistd.h>
参数 |
fildes |
buf |
nbyte |
说明 |
要读取的文件的文件描述符 |
指向存放读取到的数据的缓冲区 |
要读取的字节数 |
返回值:成功返回读取的字节数,失败返回-1
备注1:调用成功返回的读取到的字节数不一定等于nbyte,比如已经读到文件末尾
备注2:读取普通文件时,默认从文件开头开始读取,每读取一个字节读写位置向后移一个字节
写入文件:
ssize_t write(int fildes, const void *buf, size_t nbyte);
需要包含的头文件:<unistd.h>
参数 |
fildes |
buf |
nbyte |
说明 |
要写入的文件的文件描述符 |
指向要写入的数据的缓冲区 |
要写入的字节数 |
返回值:成功返回写入的字节数,失败返回-1
备注:写入普通文件时,默认从文件开头开始写入,每写入一个字节读写位置向后移一个字节
读写位置重定位:
off_t lseek(int fildes, off_t offset, int whence);
需要包含的头文件:<unistd.h>
参数 |
fildes |
offset |
whence |
说明 |
要重定位读写位置的文件的文件描述符 |
偏移量,字节为单位,正值代表向前偏移,负值代表向后偏移 |
重定位的起始位置 |
可选参数 |
/ |
/ |
SEEK_SET:文件开头 SEEK_CUR:当前读写位置 SEEK_END:文件末尾 |
返回值:成功返回重定位后的读写位置,失败返回-1
备注:重定位后的位置 = whence + offset