Linux内核-标准IO和系统IO的区别

  1. 概念
    标准IO:指的是C语言实现的文件操作的函数
    系统IO(文件IO):指的是linux或windows或unix,实现文件操作的函数。

  2. 为什么要有两种IO
    C语言要实现跨平台,所以C语言在不同操作系统中实现文件操作方式是不一样的
    因为:标准IO函数会去调用系统IO函数

  3. 它们主要的区别
    标准IO有缓冲区,系统IO没有缓冲区

  4. 缓冲模式
    全缓冲模式:程序员自己打开的文件流
    1、当缓冲区满了,会实际执行IO操作。
    2、当执行fclose函数或fflush函数(不管缓冲区是否是满的,
    强制执行IO操作,刷新缓冲区的数据)
    3、当程序退出的时候,操作系统会帮我们把所有已打开的文件流进行关闭
    行缓冲模式:stdin,stdout
    1、行缓冲区满了,会执行执行IO操作。
    2、当缓冲区中存在了换行操作符\n,会执行IO操作。
    无缓冲模式:stderr

  5. 文件描述符
    C程序启动起来以后,会有三个默认的文件被打开,
    stdin(标准输入,编号0)、stdout(标准输出,编号1)、stderr(标准错误,编号2)
    如果我们也打开了一个fopen打开了一个文件,那么这个文件的编号就是3
    这种编号就称为文件描述符

  6. 流的概念
    stream 流:形象的比喻数据的流向。
    输入流:数据从文件到内存,I:Input
    输出流:内存流向文件,O:output
    生活中水流,有方向的

  7. 标准IO相关函数

    打开文件流:

	FILE *fopen(const char *pathname, const char *mode);根据文件的路径,使用不同打开模式,打开一个文件,返回值是一个文件流FILE *fdopen(int fd, const char *mode);fd:文件描述符,socket 已经打开了一个文件,socket和文件结合起来,就可以使用fdopen。FILE *freopen(const char *pathname, const char *mode, FILE *stream);重新打开文件流,以前设置的文件流的属性,会被重置

按照文本方式读流:

  int fgetc(FILE *stream):从流中读取一个字符,返回值是负数代表的是读失败了,整数和0代表读出来的字符char *fgets(char *s, int size, FILE *stream):从stream中读取size个字符,读到s缓冲区中;读到内容返回是s,读不到内容返回NULLint getc(FILE *stream):同fgetcint getchar(void):从控制台拿一个字符,等同于getc(stdin)int ungetc(int c, FILE *stream):c字符放入stream流的后边,相当于将c追加到stream中

按照文本方式写流:

  int fputc(int c, FILE *stream):将字符c写入到stream中,如写成功返回c的int值,写失败返回的EOFint fputs(const char *s, FILE *stream):将字符串s写入到stream中,如果成功返回写入的个数,如果失败返回EOFint putc(int c, FILE *stream):同fputcint putchar(int c):往控制台输出一个字符串,等同于putc(c, stdout)int puts(const char *s):往控制台输出一行字符串,等同于fputs(s,stdout)

按照二进制方式读写流:

   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream):从stream中读取nmemb*size个字节,放到ptr中。成功:返回的是读到了多少个单元数据失败:若出现错误或到达文件末尾,则返回值可能小于nmemb或0。size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream):从ptr中读取nmemb*size个字节,然后写入到stream中。成功:返回的是写入了多少个单元数据失败:若出现错误,则返回值可能小于nmemb或0

检查或者重置流状态:

	void clearerr(FILE *stream):clearerr函数就是要复位这些错误标志,也就是使fp所指向的文件的错误标志和文件结束标志置0,从而使文件恢复正常。int feof(FILE *stream):检测流上的文件结束符,如果文件结束,则返回非0值,否则返回0int ferror(FILE *stream):如果ferror返回值为0(假),表示未出错。如果返回一个非零值,表示出错。应该注意,对同一个文件 每一次调用输入输出函数,均产生一个新的ferror函 数值,因此,应当在调用一个输入输出函数后立即检 查ferror函数的值,否则信息会丢失int fileno(FILE *stream):获取已经打开的文件描述符(用于获取系统io的文件描述符)

刷新流:

int fflush(FILE *stream):强制刷新输出缓冲区中的内容到文件中。stream为NULL,将强制刷新进程中的所有缓冲区stream是一个指定的文件流,会刷新stream输出缓冲区到文件中

重新定位流:

int fseek(FILE *stream, long offset, int whence);whence=SEEK_SET,offset=10,从文件的头开始计算,偏移10个字节whence=SEEK_CUR,offset = 2,从文件当前位置开始计算,向后偏移2个字节whence=SEEK_CUR,offset = -2,从文件当前位置开始计算,向前偏移2个字节whence=SEEK_END,offset = -2,从文件最后位置开始计算,向前偏移2个字节whence=SEEK_END,offset = 100,从文件最后位置开始计算,向后偏移100个字节设置成功:返回0设置失败:返回非0fseek函数限制是文件大小不能超过2G
long ftell(FILE *stream):获取当前文件的位置指针
void rewind(FILE *stream):文件位置指针设置到文件开头,等价于:(void) fseek(stream, 0L, SEEK_SET)
int fgetpos(FILE *stream, fpos_t *pos):等价于:ftell(从文件头开始计算)
int fsetpos(FILE *stream, const fpos_t *pos):等价于fseek函数(whence==SEEK_SETint fseeko(FILE *stream, off_t offset, int whence):和fseek类似,但是扩展了long的长度,前提是要加入宏_FILE_OFFSET_BITS
off_t ftello(FILE *stream):类似于ftell

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207030.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文详解Java反射

文章目录 反射是什么?反射的作用所有方法汇总一、加载Class对象二、加载类的构造器对象三、加载类的成员变量四、加载类的成员方法 反射是什么? 反射就是:加载类,并允许以编程的方式解剖类中的某个成分(成员变量&#…

实战:Docker Compose 下 Nginx、Java、Mysql 和 Redis 服务协同部署(包含解决浏览器访问Linux部署服务器本地资源问题)

1. 背景 在该实战中,我们将探讨如何使用Docker Compose协同部署Nginx、Java、Mysql和Redis服务,实现一个视频上传与展示的应用。具体需求如下: Java应用负责上传视频和图片资源到Nginx目录下,作为资源服务器。Nginx服务作为静态…

Numpy数组常用属性汇总(第5讲)

Numpy数组常用属性汇总 (第5讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

【JavaEE进阶】 Spring使用注解存储对象

文章目录 🌴序言🍀前置⼯作:配置扫描路径🎄添加注解存储 Bean 对象🌳类注解🚩为什么要这么多类注解🚩注解之间的联系 🎋⽅法注解 Bean🚩⽅法注解需要配合类注解使⽤ ⭕总…

探索AIGC未来:CPU源码优化、多GPU编程与中国算力瓶颈与发展

★人工智能;大数据技术;AIGC;Turbo;DALLE 3;多模态大模型;MLLM;LLM;Agent;Llama2;国产GPU芯片;GPU;CPU;高性能计算机;边缘计算;大模型显存占用;5G…

如何夸张孩子

你刚才很努力啊!——表扬努力尽管艰难,但你一直没有放弃——表扬耐心和坚持你做事情的态度非常不错——表扬态度你在_____上进步了很多!——表扬细节这个方法真有新意!——表扬创意你和小伙伴合作得真棒!——表扬合作精…

中国特供阉割版 RTX 4090 曝光,老黄这操作绝了

到了现在大伙儿应该发现:国内禁售 NVIDIA RTX 4090 显卡这事儿基本实锤了。 实际上根据老美规定,从上个月 17 号开始,凡是公司主体在中国的显卡品牌,就已经不能生产和销售 RTX 4090。 以后厂商想要卖 4090 只能以整机形式出售&am…

艺术画廊展厅网站制作的效果如何

艺术展厅往往有很多人前往,在主要城市有不少画廊,对经营者来说,不同于销售行业,其更多的是打造品牌吸引用户前来或合作等形式,而由于行业特殊性,需要准属性用户才会前往。 因此在品牌打造及信息承载宣传方…

防止企业敏感数据泄露

敏感数据泄露是指意外或故意泄露关键信息,例如个人身份信息(PII)、支付卡信息(PCI)、受保护的电子健康信息(ePHI)和知识产权(IP),数据保护措施不足的组织会在…

10-Hadoop组件开发技术

单选题 题目1:下列选项描述错误的是? 选项: A Hadoop HA即集群中包含Secondary NameNode作为备份节点存在。 B ResourceManager负责的是整个Yarn集群资源的监控、分配和管理工作 C NodeManager负责定时的向ResourceManager汇报所在节点的资源使用情况…

Spark---DataFrame存储、Spark UDF函数、UDAF函数

四、DataFrame存储Spark UDF函数 1、储存DataFrame 1)、将DataFrame存储为parquet文件 2)、将DataFrame存储到JDBC数据库 3)、将DataFrame存储到Hive表 2、UDF:用户自定义函数 可以自定义类实现UDFX接口 java: …

案例062:基于微信小程序的健身房私教预约系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

模块式雨水调蓄池施工简单,无需大型机械,可实现当天开挖当天回填

模块式雨水调蓄池的施工过程非常简单,无需大型机械和繁琐的施工工艺。在施工过程中,只需要进行简单的开挖和回填即可,而且可以在当天完成。这种施工方式不仅节省了施工时间和成本,还可以避免因大型机械和繁琐工艺引起的安全隐患。…

MIT_线性代数笔记: 复习一

目录 问题一问题二问题三问题四 本讲为考前复习课,考试范围就是 Axb 这个单元,重点是长方形矩阵,与此相关的概念包括零空间、左零空间、秩、向量空间、子空间,特别是四个基本子空间。当矩阵为可逆的方阵时,很多性质是一…

二叉树的层次遍历

102. 二叉树的层序遍历 - 力扣(LeetCode) 题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 样例输入 示例 1: 输入:root [3…

php研究课题

对于PHP这门语言而言,可以研究的课题有很多,以下是可能的课题方向和对应的内容: PHP语言基础研究 PHP语言特性和基本语法PHP的数据类型、变量、运算符和表达式PHP的流程控制语句PHP的函数和引用PHP的面向对象编程和设计模式 PHP与Web开发 …

harmony开发之Text组件的使用

TextInput、TextArea是输入框组件,通常用于响应用户的输入操作,比如评论区的输入、聊天框的输入、表格的输入等,也可以结合其它组件构建功能页面,例如登录注册页面。 图片来源黑马程序员 Text组件的使用: 文本显示组…

flutter学习-day1-环境搭建和启动第一个项目

📚 目录 SDK 下载配置环境变量安装 flutter搭建 Android 环境SDK 和依赖升级IDE 配置与使用 Android Studio 配置与使用VS Code 配置与使用 真机调试 本文学习和引用自《Flutter实战第二版》:作者:杜文 1. SDK下载 前置需要操作系统 window …

Spring Cloud + Vue前后端分离-第4章 使用Vue cli 4搭建管理控台

Spring Cloud Vue前后端分离-第4章 使用Vue cli 4搭建管理控台 4-1 使用vue cli创建admin项目 Vue 简介 Vue作者尤雨溪在google工作时,最早只想研究angular的数据绑定功能,后面觉得这个小功能很好用,有前景,就再扩展&#xff…

[MySQL] MySQL复合查询(多表查询、子查询)

前面我们学习了MySQL简单的单表查询。但是我们发现,在很多情况下单表查询并不能很好的满足我们的查询需求。本篇文章会重点讲解MySQL中的多表查询、子查询和一些复杂查询。希望本篇文章会对你有所帮助。 文章目录 一、基本查询回顾 二、多表查询 2、1 笛卡尔积 2、2…