文件或目录读写操作函数
文章目录
学习目的:
学会文件或目录读写操作常用函数。
open函数:
open函数:可以打开或创建一个文件(需包含头文件 unistd.h)。
如下:
int open(char *pathname,int flage)
int open(char *pathname,int flage,mode_t mode)
参数
pathname:欲打开文件的路径名。
flage:文件打开方式。(需包含头文件 fcntl.h)
mode:参数3使用前提,参数2指定了O_CREAT。(取值8进制数,用来描述文件的访问权限。 rwx 0664)
返回值
成功:打开文件所得对应的文件描述符
失败:-1 设置errno
flage | 作用 | flage | 作用 |
---|---|---|---|
O_RDONLY | 以只读方式打开文件 | O_WRONLY | 以只写方式打开文件 |
O_RDWR | 以可读写方式打开文件 | O_CREAT | 欲打开文件不存在,则创建文件 |
O_APPEND | 当读写文件时从文件尾开始移动 | O_TRUNC | 若文件存在,长度被截为0,属性不变 |
O_APPEND | 当读写文件时从文件尾开始移动 | O_TRUNC | 以不可阻断的方式打开文件 |
close函数:
close函数:关闭一个已经打开的文件
int close(int fd)
参数
fd:打开文件所得到对应的文件描述符
错误处理函数:
错误处理函数:与errno相关,输出打开文件错误信息。
printf("xxx error: %d\n",errno);
char *strerror(int errnum);
printf("xxx error: %s\n",strerror(errno));
viod perror(const char *s);
perror("open error");
read函数:
read函数:从打开的设备或文件中读取数据,读取的数据保存在缓冲区中,这个读写位置记在内核中,使用C标准的I/O库时的读写位置是用户空间的I/O缓冲区中的位置。
ssize_t read(int fd,void *buf,size_t count);
参数
fd:打开文件所得到对应的文件描述符
buf:存数据的缓冲区
buf:缓冲区大小
返回值
0:读到文件末尾。
成功:>0读到的字节数。
失败:-1 设置 errno。
-1,并且errno = RAGIN 或 EWOULDBLOCK,说明不是read失败,而是read在以非阻塞方式读一个设备文件(网络文件),并且文件无数据。
write函数:
write函数:从打开的设备或文件中读取数据,读取的数据保存在缓冲区中,这个读写位置记在内核中,使用C标准的I/O库时的读写位置是用户空间的I/O缓冲区中的位置。
ssize_t read(int fd,void *buf,size_t count);
参数
fd:打开文件所得到对应的文件描述符
buf:存数据的缓冲区
count:数据大小
返回值
成功:写入的字节数。
失败:-1 设置 errno。
fcntl函数:
fcntl函数:根据文件描述符来操作文件的特性。
int fcntl(int fd,int cmd);
参数
fd:打开文件所得到对应的文件描述符
cmd参数:F_GETFL(获取文件状态) F_SETFL(设置文件状态)
返回值
成功:返回特定命令的返回值。
失败:-1 设置 errno。
lseek函数:
lseek函数:移动文件的读写位置。
off_t lseek(int fd,off_t offset,int whence);
参数
fd:打开文件所得到对应的文件描述符
offset:偏移量
whence:起始偏移位 SEEK_SET/SEEK_CUR/SEEK_END
返回值
成功:较起始偏移位置。
失败:-1 设置 errno。
应用场景
- 文件的“读”、“写”使用同一偏移位置。
- 使用lseek获取文件大小。
- 使用lseek拓展文件大小:要使文件真正扩展,必须进行I/O操作。
- 使用truncate函数。直接扩展文件
int ret = truncate(const char *pathname,off_t length);
stat/lstat函数:
stat/lstat函数:通过文件名获取文件信息,并保存在buf所指的结构体stat中(stat符号穿透,lstat不会)。
获取文件大小:buf.st_size
获取文件类型和权限:buf.st_mode
int stat(const char *path,struct stat *buf);
参数
path:文件路径
buf:(传出参数)存放文件属性。
返回值
成功:0。
失败:-1 设置 errno。
dup/dup2函数:
dup/dup2函数:复制一个现存的文件描述符。
int dup(int oldfd);
int dup2(int oldfd,int newfd);
参数
oldfd:已有文件描述符
newfd:新文件描述符。
返回值
成功:新文件描述符。
失败:-1 设置 errno。
补充:
-
文件描述符:
- PCB进程控制块:本质结构体。
- 成员:文件描述符表。
- 文件描述符:0/1/2/3/4…/1023
- 0 - STDIN_FILENO
- 1 - STDOUT_FILENO
- 2 - STDERR_FILENO
-
阻塞、非阻塞:是设备文件、网络文件的属性。
- 产生阻塞的场景:读设备文件,读网络文件。(读常规文件无阻塞概念。)
- /dev/tty – 终端文件。
- 打开文件时使用O_NONBLOCK参数设置为非阻塞状态。
-
传入参数
- 指针作为函数参数。
- 通常有const关键字修饰。
- 指针指向有效区域,在函数内部读操作。
-
传出参数
- 指针作为函数参数。
- 在函数调用之前,指针指向的空间可以无意义,但必须有效。
- 在函数内部,做写操作。
- 函数调用结束后,充当函数返回值。
-
传入传出参数
- 指针作为函数参数。
- 在函数调用之前,指针指向的空间有实际意义。
- 在函数内部先做读操作,再做写操作。
- 函数调用结束后,充当函数返回值。
-
目录操作函数
DIR *opendir(char *name);
int closedir(DIR *dp);
struct dirent *readdir(DIR *dp);