文件或目录读写操作函数

本文介绍了C语言中用于文件或目录读写的关键函数,如open(), close(), read(), write(), fcntl(), lseek(), stat()等,讲解了它们的作用、参数和常见错误处理方法。涵盖了文件描述符、阻塞/非阻塞操作以及文件属性获取。
摘要由CSDN通过智能技术生成

文件或目录读写操作函数

学习目的:

学会文件或目录读写操作常用函数。


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);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值