流类库与输入输出

来源:《C++语言程序设计》

像C语言一样,C++语言也没有输入输出语句。

但C++标准库中有一个面向对象的输入输出软件包,即I/O流类库。

流是I/O流类的中心概念。

------

I/O流类库是C语言中I/O函数在面向对象的程序设计方法中的一个替换产品。

------

在C++中,将数据一个对象另外一个对象流动抽象为"流"。

从流中获取数据的操作称为提取操作

向流中添加数据的操作称为插入操作

数据的输入与输出就是通过I/O流来实现的。

------

当程序与外界环境进行信息交流时,存在着两个对象,一个是程序中的对象,另一个是文件对象。

流是一种抽象,它负责在数据的生产者和数据的消费者之间建立联系,并管理数据的流动。

------

程序建立一个流对象,并指定这个流对象与某个文件对象建立连接,程序操作流对象,流对象通过文件系统对所连接的文件对象产生作用。

-------

由于流对象程序中的对象文件对象进行交互的连接,对程序对象而言,文件对象该有的特性,流对象也有,所以程序将流对象看作是文件对象的化身

-------

操作系统是将键盘,屏幕,打印机和通信端口作为扩充文件来处理的,而这些处理是通过操作系统设备驱动程序来实现的。

因此,从C++程序员的角度看,这些设备磁盘文件是等同的,与这些设备的交互也是通过I/O流类来实现的。

------

在许多操作系统中,输入输出设备如键盘、屏幕、打印机和通信端口等都可以通过文件系统的抽象来访问。

这种抽象使得对这些设备的操作与文件操作非常相似,从而简化了编程模型。

以下是操作系统如何将这些设备视为“文件”来处理的一些具体方式:

键盘:通常被抽象为标准输入设备

在类Unix系统中通常对应于文件/dev/stdin/dev/tty

在Windows系统中,可以通过CONIN$来访问。

屏幕:通常被抽象为标准输出设备

在类Unix系统中通常对应于文件/dev/stdout/dev/tty

在Windows系统中,可以通过CONOUT$来访问。

---------

在Windows系统中,CONIN$ 和 CONOUT$ 是特殊的设备名称

它们分别用于访问控制台输入(通常是键盘)和控制台输出(通常是屏幕)。

  • CONIN$:用于访问控制台输入。在命令行或批处理脚本中,你可以使用 CONIN$ 来从键盘读取输入。

  • CONOUT$:用于访问控制台输出。你可以将输出重定向到 CONOUT$,通常这是默认的控制台输出目的地。

例如,在命令提示符(cmd.exe)中,你可以使用以下命令来将键盘输入重定向到一个文件:

这个命令会将你从键盘输入的内容重定向到 input.txt 文件中,直到你按下 Ctrl+Z(在Windows中,Ctrl+Z 表示文件结束符EOF)。

打印机:在类Unix系统中,打印机通常通过特殊的设备文件来访问如/dev/lp0/dev/usb/lp0

在Windows系统中,打印机通过打印机队列来访问,这些队列可以被看作是特殊的文件。

通信端口

串行端口(如COM1、COM2等)在类Unix系统中通常表示为设备文件,如/dev/ttyS0/dev/ttyUSB0

在Windows系统中,它们通过命名管道(如\\.\COM1)来访问。

---------

流所涉及的范围还远不止于此,凡是数据一个地方传输另一个地方的操作都是流的操作。

网络数据交换进程数据交换等都是流操作

 流操作也可以针对一个字符串进行。

因此,一般意义上的读操作在流数据抽象中被称为(从流中)提取写操作被称为(向流中)插入

---------

I/O流类库的基础是一组类模板,类模板提供了库中的大多数功能,而且可以作用于不同的元素。

流的基本单位除了普通字符(char类型)外,还可以是其他类型(例如wchar_t),流的基本单位的数据类型就是模板的参数。

---------

wchar_t 是 C 和 C++ 编程语言中的一个数据类型,它是 “wide character” 的缩写,用于表示宽字符。宽字符是为了支持国际化和多字节字符集(如 Unicode)而设计的,它能够存储比标准 char 类型更广泛的字符集。

--------

使用I/O流时一般无需直接引用这些模板,因为C++的标准头文件中已经用typedef为这些模板面向char类型的实例定义了别名。

由于模板的实例和类具有相同的性质,可以直接把这些别名看作流类的类名。

--------

为简便起见,把这些别名所表示的模板实例叫类。

在I/O流类库中,头文件iostream声明了4个预定义的流对象,用来完成在标准设备上的输入输出操作:cin,cout,cerr,clog。

---------

I/O流类库中面向char类型的类:

--------

抽象流基类:ios

-------

输入流类:

istream:通用输入流类和其他输入流的基类

ifstream:文件输入流类

istringstream:字符串输入流类

--------

输出流类:

ostream:通用输出流类和其他输出流的基类

ofstream:文件输出流类

ostringstream:字符串输出流类

--------

流缓冲区类:

streambuf:抽象流缓冲区基类

filebuf:磁盘文件的流缓冲区类

stringbuf:字符串的流缓冲区类

-----------------

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

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

相关文章

cocos creator 3.8.3物理组件分组的坑

坑,坑的不行的大坑 group用的二进制的左移获取十进制的数值 目前是这样判断的,也不知道对不对,什么get、set Group没找到

基于MFC实现的赛车游戏

一、问题描述 游戏背景为一环形车道图,选择菜单选项“开始游戏”则可开始游戏。游戏的任务是使用键盘上的方向键操纵赛道上的蓝色赛车追赶红色赛车,红色赛车沿车道顺时针行驶,出发点和终点均位于车道左上方。任一赛车先达到终点则比赛结束。…

RHCE的学习(12)

第九章 Ubuntu 什么是Ubuntu 概述 Ubuntu(乌班图)属于Debian系列,Debian是社区类Linux的典范,是迄今为止最遵循GNU规范的Linux系统。 Debian最早由Ian Murdock于1993年创建,分为三个版本分支(branch&…

【案例】故障雪花屏

开发平台:Unity 6.0 开发工具:Shader Graph 参考视频:【U2D Shader Graph】❄️雪❄️花❄️屏❄️   一、效果图 二、Shader Graph 路线图 三、案例分析 核心思路:雪花屏幕效果 (混合) 原图像 最终图像…

有什么办法换网络ip动态

在数字化时代,网络已成为我们生活、工作不可或缺的一部分。然而,随着网络应用的日益广泛,IP地址作为设备在网络中的唯一标识,其重要性不言而喻。动态换IP,作为一种灵活且高效的网络技术,正逐渐受到越来越多…

Spring Boot中集成MyBatis操作数据库详细教程

目录 前言1. 项目依赖配置1.1 引入MyBatis和数据库驱动依赖1.2 数据源配置 2. 创建数据库映射实体类3. 创建Mapper层接口4. 创建Service层4.1 定义Service接口4.2 实现Service接口 5. 创建Controller层6. 运行和测试项目6.1 启动项目6.2 测试接口 7. 总结 前言 在Java开发中&a…

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏

【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏 目录 文章目录 【大语言模型】ACL2024论文-07 BitDistiller: 释放亚4比特大型语言模型的潜力通过自蒸馏目录摘要研究背景问题与挑战如何解决创新点算法模型实验效果代码推荐阅读指数&…

鸿蒙next打包流程

目录 下载团结引擎 添加开源鸿蒙打包支持 打包报错 路径问题 安装DevEcoStudio 可以在DevEcoStudio进行打包hap和app 包结构 没法直接用previewer运行 真机运行和测试需要配置签名,DevEcoStudio可以自动配置, 模拟器安装hap提示报错 安装成功,但无法打开 团结1.3版本新增工具…

基于Jeecgboot3.6.3vue3的flowable流程online表单的审批使用介绍

更多技术支持与服务请加入我的知识星球或加我微信,名称:亿事达nbcio技术交流社区https://t.zsxq.com/iPi8F 今天介绍一下基于jeecgboot3.6.3的flowable流程使用online表单进行审批的情况 1、首先建立一个online应用类型的流程,如下: 2、进行…

【LeetCode】【算法】238. 除自身以外数组的乘积

LeetCode 238. 除自身以外数组的乘积 题目描述 给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据保证数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位整数范围内。 请不…

如何构建一个可扩展的测试自动化框架?

以下为作者观点: 假设你是测试自动化方面的新手,想参与构建一个框架。在这种情况下,重要的是要了解框架所需的组件,以及它们是如何组合的。思考项目的具体需求和目标,以及可能遇到的困难和挑战。 假如你是一个测试架…

实战:索引的命中机制

在 SQL Server 中,查询是否能命中索引(即是否能使用 Index Seek)取决于多个因素,包括索引的结构、查询条件的排列、和数据库优化器的策略。以下是一些常见的命中索引和不能命中索引的情况,及其详细解释: 一、命中索引的情况 1. 前导列匹配(典型的命中索引场景) 索引结…

使用Docker快速部署FastAPI Web应用

Docker是基于 Linux 内核的cgroup、namespace以及 AUFS 类的Union FS 等技术,对进程进行封装隔离,一种操作系统层面的虚拟化技术。Docker中每个容器都基于镜像Image运行,镜像是容器的只读模板,容器是模板的一个实例。镜像是分层结…

C++【string类,模拟实现string类】

🌟个人主页:落叶 🌟当前专栏: C专栏 目录 为什么学习string类 C语言中的字符串 标准库中的string类 auto和范围for auto关键字 迭代器 范围for string类的常用接口说明和使用 1. string类对象的常见构造 2.string类对象的容量操作 3…

A019基于SpringBoot的校园闲置物品交易系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…

【赵渝强老师】Redis的RDB数据持久化

Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出会造成服务器中的数据库状态也会消失。所以 Redis 提供了数据持久化功能。Redis支持两种方式的持久化,一种是RDB方式;另一种是AOF(ap…

Excel:vba实现批量插入图片批注

实现的效果:实现的代码如下: Sub InsertImageNamesAndPictures()Dim PicPath As StringDim PicName As StringDim PicFullPath As StringDim RowNum As IntegerDim Name As StringDim Comment As CommentDim folder As FileDialog 定义文件选择对话框 清…

tomcat启动失败和缓存清理办法

tomcat只在学校接触过并且是在window xp和win7的电脑上配置过(中途升级过电脑系统),只记得在windows系统上可以将其设置成服务管理。但我已毕业10多年了,学的知识早就不知道丢哪里了。这次为了修改一个07,08年的项目&a…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议,欢迎一起共建,感谢Star。 ReactPress是一个基于React框架开发的开源发布平台,它不仅仅是一个简单的博客系统,更是一个功能全…

A20红色革命文物征集管理系统

🙊作者简介:在校研究生,拥有计算机专业的研究生开发团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹 赠送计算机毕业设计600…