Linux——文件IO流基础

作者:小 琛
欢迎转载,请标明出处
本博文将分为两部分:C语言中的文件流指针、Linux下的系统调用文件操作

C语言中的文件流指针

  1. FILE* fopen(const char* path,const char* mode)**
    函数功能:打开一个文件
    入口参数:
    path:需要打开的文件(可以带路径,若不带路径默认当前目录寻找)
    mode:打开的方式
    返回值:文件流指针

注:mode即打开的方式有如下几种

  • r,以读的方式打开,如果当前文件不存在,则会报错
  • r+,以读写的方式打开,如果当前文件不存在,会报错
  • w,以写的方式打开,当前文件不存在,会创建;当前文件存在,截断(清除),然后文件流指针指向头部
  • w+,以读写的方式打开,当前文件不存在则创建;若存在则截断,文件流指针指向头
  • a,以追加的方式打开,文件存在则创建
  • a+,以追加的方式打开,当前的a+是支持读的
  1. size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)**
    函数功能:将一个文件里的若干内容读出并储存到一个指定的地方
    入口参数:
    ptr:储存的地方,将读到的内容保存
    size:块的大小
    nmemb:块的个数
    stream:总的字节数
    返回值:读成功的块的个数
    注:这里经常将块(size)的大小指定为1,这样块的个数(nmemb)即为字节数

  2. size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream)
    函数功能:写入函数
    入口参数:
    prt,写什么数据,写道ptr当中
    size,写数据的时候块的大小
    nmemb,块的大小
    stream:写到哪里去,文件流指针
    返回值:写成功的块的个数

注:通常将size指定为1,返回值则为写入成功的字节数量

  1. int fseek(FILE* stream,long offet,int whence)
    函数功能:设置文件流指针的位置
    入口参数:
    stream:需要设置的文件流指针
    offet:偏移量
    whence:偏移的位置

注:偏移的位置通常使用宏
SEEK_SET:偏移到文件的头部
SEEK_CUR:偏移到文件流指针的当前位置
SEEK_END:偏移到文件的尾部

  1. fclose(FILE* path)
    函数功能: 关闭一个文件
    入口参数:要关闭的文件流指针
    返回值:无

Linux下系统调用的文件操作

  1. 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

  1. ssize_t write(int fd,char* buf,size_t count)
    函数功能:写入函数
    入口参数:
    fd:文件描述符
    buf:写入的数据
    count:写入数据的大小

  2. off_t lseek(int fd,off_t offset,int whence)
    fd:文件描述符
    offset:偏移量
    whence:偏移到哪去

  3. close(int fd)
    关闭文件

写在最后

文件流指针和文件描述符的关系是什么呢?
其实是封装的关系,文件流指针(接口都是库函数)都是封装文件描述符(接口都是系统调用),方便二次开发

当我们使用fwrite函数进行写操作的时候,其实是写到缓冲区,当刷新缓冲区的时候,才通过_IO_FILE当中保存的文件描述符信息将写缓冲区的内容写到文件当中去

因此使用文件流指针的时候一定要考虑到缓冲区的问题,如果当我们往一个文件中写入数据的时候,程序崩溃了,有可能会导致使用文件流指针写入的数据丢失。
当使用文件描述符的时候就没有这个问题,但是由于是立即读取立即写入,会非常耗费性能,所以在写程序的时候,一些不最重要的数据通常采用文件流指针

在这里插入图片描述

发布了63 篇原创文章 · 获赞 11 · 访问量 2221

猜你喜欢

转载自blog.csdn.net/qq_44745063/article/details/104924218