文件读写的两种方式
文件读写的方式在我的认知中大致分为两种方式,第一种是用文件指针来进行文件的读写操作,第二种就是文件描述符来进行文件的读写操作
-
以文件指针进行操作
FILE *fopen(const char *path,const char *mode);
功能:打开或者创建文件
path:路径
mode:文件打开或创建的的权限
返回值:文件指针
int fprintf(FILE *steam,const char *format,...)
stream: 文件指针,fopen的返回值
format:占位符和字符组成的一个字符串
…:变量名
返回值:成功写入的字节数
int fscanf(FILE *steam,const char *format,....)
stream: 文件指针,fopen的返回值
format:占位符和字符组成的一个字符串
…:变量的地址
返回值:读取到的字节数
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
ptr:读取文件后的存储位置
size:每次写入的字节数
nmemb:写入的次数
stream:文件指针
返回值:成功写入的次数
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
ptr:读取文件后的存储位置
size:每次读取的字节数
nmemb:读取的次数
stream:文件指针
返回值:成功读取的次数 -
以文件描述符进行的文件读取操作
int open(const char *pathname,int flags)
功能:打开文件
pathname:文件的路径
flags:打开的权限
int open(const char *pathname,int flags,mode_t mode)
功能:创建文件
pathname:文件的路径
flags:打开权限
mode:设置文件的权限
ssize_t read(int fd,void *buf,size_t count)
功能:从文件中读取数据到内存
fd:文件描述符
buf:数据的存储位置
count:读取的字节数
返回值:成功写入的字节数
注意:如果把结构体以文本形式写入到文件中,需要先把结构体转换成字符串 -
文件指针和文件描述符的区别
文件描述符是一个非负整数,表示一个打开的文件,由系统调用open/create/socket函数的返回值,为什么使用文件描述符而不像标准库那使用文件指针?因为记录文件相关信息的结构存储在内核中,为了不暴露内存的地址,因此文件指针不能直接给用户操作,内核中记录一张表,其中一列是文件描述符对应一列文件结构指针,文件描述符就相当于获取了文件结构指针的下标
内核中已经有三个已经打开的文件描述符,他们的宏定义在unistd.h
stdin 0 STDIN_FILENO
stdout 1 STDOUT_FIENO
stdree 2 STDERR_FILENO