浅谈 文件IO和标准IO

版权声明:个人爱好,可随便转载 https://blog.csdn.net/qq_43528087/article/details/88936149

基本概念

文件IO: 不带缓冲区的IO,每一次read,write都调用内核中的一个系统调用,称之为低级IO,操作系统提供的基本IO服务,与OS绑定,特定于Linux和Unix平台

标准IO: 标准IO处理了很多细节,对文件IO进行了封装,可移植性高,提供缓冲区(全缓冲、行缓冲、不带缓冲)

区别: 通过文件IO读写文件时,会频繁的进行系统调用,这样就增加了系统的开销;而标准I/O可以看成是在文件I/O的基础上封装了缓冲机制。先读写缓冲区,必要时再访问实际文件,从而减少了系统调用的次数

文件IO常用函数

<1>:打开文件
int open(const char *pathname,    //文件名
int flags,             //模式
                O_RDONLY 只读
                O_WRONLY 只写
                O_RDWR 可读可写
                O_NOCTTY 以非终端形式打开
                O_CREAT 可创建
mode_t mode);         //权限

返回值: 失败-1
    成功返回 3-1023
    0—>stdin
    1—>stdout
    2—>stderr
    
<2>写入文件: 
ssize_t write(int fd,   //open返回值
  const void *buf,   //需要被写入的字符串的首地址—缓冲区
  size_t count);   //写入count个字节
返回值: 成功返回被写入的字节数,当没有数字被写的时候,返回0
    失败返回-1
    
<3>读取文件
ssize_t read(int fd, //open返回值
void *buf,     //从文件中读取到的字符串存放的首地址—缓冲区
size_t count);    //读取count个字节

<4>偏移光标
off_t lseek(int fd,   //open的返回值
off_t offset,     //偏移的字节数 off_t表示可为正也可为负
int whence);    //偏移的起始位置
         SEEK_SET  文件头
         SEEK_CUR  当前文件光标位置
         SEEK_END  文件末尾
返回值:成功,返回从文件头到偏移后的光标所在位置的字节数
    失败,返回-1
应用:获取文件大小
   num = lseek(fd,0,SEEK_END);

<5>关闭文件
int close(int fd);   //open返回值
返回值:成功返回0 失败返回-1

标准IO常用函数

<1>;打开文件
FILE *fopen(const char *path,   //需要被打开的文件
     const char *mode);   //打开的模式
        "r"只读模式
        “r+” 可读可写模式
        "w"只写,清空文件内容或创建新文件来写入
        “w+” 可读可写,只有在文件不存在时,才会创建
        "a"只写,从文件末尾追加写入
        “a+” 可读可写,从文件末尾追加写入
返回值,成功返回结构体指针,失败返回NULL

<2>读取文件
size_t fread(void *ptr,     //读取到的内容存放的首地址
    size_t size,      //一次读取的长度
   size_t nmemb,     //读取的次数
   FILE *stream);    //fopen的返回值
   
<3>写入文件
size_t fwrite(const void *ptr,   //写入的内容存放的首地址
      size_t size,    //一次写入的长度
     size_t nmemb,   //写入的次数
     FILE *stream);   //fopen的返回值

<4>偏移文件光标
int fseek(FILE *stream,     //fopen的返回值
     long offset,     //偏移的字节数
     int whence);    //开始偏移的位置
              SEEK_SET 文件头
              SEEK_CUR 当前文件光标位置
              SEEK_END 文件末尾
返回值,成功返回0,失败返回-1

long ftell(FILE *stream);   //fopen的返回值
返回值,成功返回当前文件光标距离头文件位置,失败返回-1

获取文件大小:
      fseek(fp,0,SEEK_END);
      int num=ftell();
      —>num就是文件大小
<5>关闭文件
int fclose(FILE *stream);   //fopen的返回值

猜你喜欢

转载自blog.csdn.net/qq_43528087/article/details/88936149