zl程序教程

您现在的位置是:首页 >  系统

当前栏目

Linux中的系统IO与标准IO

2023-09-11 14:21:43 时间

一、系统IO与标准IO的区别

什么是系统IO与标准IO:(IO为Input/Output,即输入/输出接口)

  • 系统IO:由操作系统直接提供的接口函数
  • 标准IO:由标准C库(第三方库)提供的接口函数(通过封装操作系统提供的系统IO,再给用户使用)

系统IO和标准IO的主要区别:

  • 系统IO:不带缓冲机制,系统IO可以操作普通文件与驱动文件
  • 标准IO:带缓冲机制,标准IO只可以操作普通文件。提供多种的格式的输入输出如(字符串、整形......)

缓冲的作用与刷新条件

  • 作用:
  • 在进行数据的读写的过程中,先不把数据直接写入或者读入设备中,而是写或者读入内存空间,当满足一定条件时候,将该空间的文件写入文件或设备中。这样可以减少操作系统调用驱动程序或文件的次数,提高读写的速度,和代码的效率。因为每一次系统调用的过程都是很浪费系统资源的。

刷新条件:

  • 缓冲区已满
  • 强制刷新
  • 程序结束
  • 关闭文件
  • 例1:
  • 系统IO与标准IO的示意图:

 

  • 例2
  • 系统IO与标准IO的区别示意图

二、使用系统IO与标准IO的常见步骤

设备文件:

  • open打开设备文件
  • mmap映射设备地址
  • close关闭设备文件
  • 对映射的内存操作.......

普通文件:(若需要格式化输入输出

  • fopen打开普通文件
  • 对文件的读/写 (fscanf,fprintf,fread,fwrite........)
  • fclose关闭文件

三、常用系统IO以及标准IO的详细参数

注意:在使用API接口的时候,我们只要注意需要什么参数,以及参数的返回值

一、打开文件:open 与 fopen(可以在linux中使用 man 2 open 与 man 3 fopen 查看详细手册)


系统IO


头文件:

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <fcntl.h>

接口函数:

  • int open(const char *pathname, int flags);

参数解析:

  • 参数一、需要打开文件的路径名(pathname)
  • 参数二、打开文件的权限请求(flags)
  • O_RDONLY,   //只读
  • O_WRONLY,   //只写
  • O_RDWR.     //读写 
  • O_CREAT//带创建打开
  • O_EXCL//检测文件是否存放
  • O_NOCTTY//以不阻塞方式打开
  • O_TRUNC//以清空方式打开  
  • O_APPEND//以追加方式打开

返回值:

  • 成功:返回 文件描述符
  • 失败:返回 -1

标准IO


头文件:    

  • #include <stdio.h>

接口函数:

  • FILE *fopen(const char *path, const char *mode);

参数解析:

  • 参数一、需要打开的路径名(path)
  • 参数二、打开文件的权限(mode)
  • "r"  只读  
  • "r+" 读写  
  • w"  只写,带创建  :存在清空
  • "w+" 读写, 带创建  :存在清空
  • "a"  只写并追加  带创建
  • "a+" 读写并追加  带创建

 返回值:

  • 成功:返回文件指针
  • 失败:返回 NULL

二、读取文件:read 和 fread (在linux中可以用 man 2 read 和 man 3 fread 来查看详细手册)


系统IO


头文件:

  • #include <unistd.h>

接口函数:

  • ssize_t read(int fd, void *buf, size_t count);

参数解析:

  • 参数一、文件描述符(fd)
  • 参数二、从文件读取数据后,存放的缓存地址
  • 参数三、需要读取的字节数

返回值:

  • 成功:成功读取到的字节数
  • 失败:0 读取到的文件是0字节 或者 已经读到文件末尾
  •           -1 读取数据失败

标准IO


头文件:

  • #include <stdio.h>

接口函数:

  • size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数解析:

  • 参数一、存放数据的缓存地址(ptr)
  • 参数二、数据类型大小 / 数据块大小(size)
  • 参数三、多少个这样的数据(块) (nmemb)
  • 参数四、需要读取的文件指针(stream)

返回值:

  • 成功:读取到的字节块数量(注意:不是字节数)
  • 失败:返回 0 或者 -1

三、写入文件: write 和 fwrite (在linux中可以使用man 2 write 和 man 3 fwrite查看详细手册)


系统IO


头文件:

  • #include <unistd.h>

函数接口:

  • ssize_t write(int fd, const void *buf, size_t count);

参数解析:

  • 参数一、文件描述符(fd)
  • 参数二、需要写入文件的数据的缓存地址(buf)
  • 参数三、写入文件的字节大小(count)

返回值:

  • 成功:成功写入的字节数
  • 失败: 返回 -1

标准IO


头文件:

  • #include <stdio.h>

函数接口:

  • size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);

参数解析:

  • 参数一、需要写入的数据的缓存地址
  • 参数二、写入的数据类型大小 / 数据块大小
  • 参数三、写入数据块的数量
  • 参数四、需要写入的文件指针

返回值:

  • 成功:返回写入数据块的个数(注意:不是字节数!)
  • 失败: 返回 -1

五、光标移动 lseek 和 fseek (在linux中可以使用man 2 lseek 和 man 3 fseek查询详细手册)


系统IO


头文件:

  • #include <sys/types.h>
  • #include <unistd.h>

接口函数:

  • off_t lseek(int fd, off_t offset, int whence);

参数解析:

  • 参数一、文件描述符(fd)
  • 参数二、光标偏移量(offset)
  • 参数三、光标位置来源(whence)
  • SEEK_SET  文件头开始
  • SEEK_CUR  光标的当前位置开始
  • SEEK_END   从文件末尾开始

返回值:

  • 成功:返回 偏移量的大小
  • 失败:返回 -1

标准IO


头文件:

  • #include<stdio.h>

函数接口:

  • int fseek(FILE *stream, long offset, int whence);

参数解析:

  • 参数一、文件指针(stream)
  • 参数二、光标偏移量(offset)
  • 参数三、光标位置来源(whence)
  • SEEK_SET  文件头开始
  • SEEK_CUR  光标的当前位置开始
  • SEEK_END   从文件末尾开始

六、关闭文件


系统IO


头文件:

  • #include <unistd.h>

函数接口:

  • int close(int fd);

参数解析:

  • 参数一、文件描述符

返回值:

  • 成功:返回 0
  • 失败:返回 -1

标准IO


头文件:

  • #include<stdio.h>

函数接口:

  • int fclose(FILE *fp);

参数解析:

  • 参数一、文件描述符(fd)

返回值:

  • 成功:返回 0
  • 失败:返回 EOF