作者:小 琛
欢迎转载,请标明出处
本博文将分为两部分:C语言中的文件流指针、Linux下的系统调用文件操作
C语言中的文件流指针
- FILE* fopen(const char* path,const char* mode)**
函数功能:打开一个文件
入口参数:
path:需要打开的文件(可以带路径,若不带路径默认当前目录寻找)
mode:打开的方式
返回值:文件流指针
注:mode即打开的方式有如下几种
- r,以读的方式打开,如果当前文件不存在,则会报错
- r+,以读写的方式打开,如果当前文件不存在,会报错
- w,以写的方式打开,当前文件不存在,会创建;当前文件存在,截断(清除),然后文件流指针指向头部
- w+,以读写的方式打开,当前文件不存在则创建;若存在则截断,文件流指针指向头
- a,以追加的方式打开,文件存在则创建
- a+,以追加的方式打开,当前的a+是支持读的
-
size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)**
函数功能:将一个文件里的若干内容读出并储存到一个指定的地方
入口参数:
ptr:储存的地方,将读到的内容保存
size:块的大小
nmemb:块的个数
stream:总的字节数
返回值:读成功的块的个数
注:这里经常将块(size)的大小指定为1,这样块的个数(nmemb)即为字节数 -
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream)
函数功能:写入函数
入口参数:
prt,写什么数据,写道ptr当中
size,写数据的时候块的大小
nmemb,块的大小
stream:写到哪里去,文件流指针
返回值:写成功的块的个数
注:通常将size指定为1,返回值则为写入成功的字节数量
- int fseek(FILE* stream,long offet,int whence)
函数功能:设置文件流指针的位置
入口参数:
stream:需要设置的文件流指针
offet:偏移量
whence:偏移的位置
注:偏移的位置通常使用宏
SEEK_SET:偏移到文件的头部
SEEK_CUR:偏移到文件流指针的当前位置
SEEK_END:偏移到文件的尾部
- fclose(FILE* path)
函数功能: 关闭一个文件
入口参数:要关闭的文件流指针
返回值:无
Linux下系统调用的文件操作
- int open(const char* pathname,int flags,mode_t mode)
函数功能:打开文件
入口参数:
pathname:要打开的文件路径
flags:以何种方式去打开
mode:设置文件的权限,可以直接给八进制
返回值:成功返回大于0的整数(返回文件描述符fd),失败返回-1
注:这里的文件描述符在前面的博客中有讲到:https://blog.csdn.net/qq_44745063/article/details/104642064
-
ssize_t write(int fd,char* buf,size_t count)
函数功能:写入函数
入口参数:
fd:文件描述符
buf:写入的数据
count:写入数据的大小 -
off_t lseek(int fd,off_t offset,int whence)
fd:文件描述符
offset:偏移量
whence:偏移到哪去 -
close(int fd)
关闭文件
写在最后
文件流指针和文件描述符的关系是什么呢?
其实是封装的关系,文件流指针(接口都是库函数)都是封装文件描述符(接口都是系统调用),方便二次开发
当我们使用fwrite函数进行写操作的时候,其实是写到缓冲区,当刷新缓冲区的时候,才通过_IO_FILE当中保存的文件描述符信息将写缓冲区的内容写到文件当中去
因此使用文件流指针的时候一定要考虑到缓冲区的问题,如果当我们往一个文件中写入数据的时候,程序崩溃了,有可能会导致使用文件流指针写入的数据丢失。
当使用文件描述符的时候就没有这个问题,但是由于是立即读取立即写入,会非常耗费性能,所以在写程序的时候,一些不最重要的数据通常采用文件流指针