流类库与输入输出

来源:《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没找到

hhdb数据库介绍(9-4)

访问安全 权限体系 计算节点有两类用户,一类是计算节点数据库用户,用于操作数据,执行SELECT,UPDATE,DELETE,INSERT等SQL语句。另一类是关系集群数据库可视化管理平台用户,用于管理配置信息。此…

基于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 路线图 三、案例分析 核心思路:雪花屏幕效果 (混合) 原图像 最终图像…

图像手动标注-labelme+yolo格式导出

conda环境 运行以下命令来激活你的虚拟环境: conda activate labelme如果你没有创建 labelme 环境,首先需要创建一个环境并安装 labelme: conda create -n labelme python3.8 conda activate labelme conda install -c conda-forge labelm…

有什么办法换网络ip动态

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

unity实习生面试

北京教育中厂的成都分部 11.5 时长有28分钟 一面二面合并了 面试官人挺好的,也不是特别急,答的不是很好的问题面试官直接跳过了 顺序不是很统一 只写记得的部分 1.问了值类型和引用类型的区别 2. 问了ugui的组件有哪些 ugui有哪些优化方案 答用打图集…

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…

OpenCV相机标定与3D重建(2)鱼眼相机模型

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 鱼眼相机是一种具有非常宽视野的相机,通常会产生强烈的径向畸变。鱼眼相机模型旨在捕捉这种畸变,以便能够准确地处理和校…

Matplotlib 绘图艺术:从新手到高手的全面指南

引言 在数据科学和机器学习领域,数据可视化是一项至关重要的技能。一个优秀的可视化图表可以直观地展示数据的内在规律,帮助我们更好地理解数据,并做出更明智的决策。而在众多的绘图库中,Matplotlib 是 Python 中最强大、最灵活的…

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

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

RocketMQ部署教程

拉取 RocketMQ 镜像: 首先,从 Docker Hub 获取最新的 RocketMQ 镜像: docker pull apache/rocketmq:latest创建 Docker 网络: 为了使各容器之间能够通信,创建一个名为 rocketmq 的网络: docker network cre…

ORACLE批量插入更新如何拆分大事务?

拆分大事务 一、批量插入更新二、拆分事务之前文章MYSQL批量插入更新如何拆分大事务?说明了Mysql如何拆分,本篇文章探讨Oracle或OceanBase批量插入更新拆分大事务的问题 一、批量插入更新 oracle批量插入更新可使用merge语法eg: merge test ausing test_tmp bon (a.id = b.id…

鸿蒙next打包流程

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

chatgpt3.5权重参数有多少MB;llama7B权重参数有多少MB

目录 chatgpt3.5权重参数有多少MB llama7B权重参数有多少MB chatgpt3.5权重参数有多少MB 关于ChatGPT 3.5的权重参数占用的存储空间大小,虽然直接给出具体的MB数值可能较为困难(因为这取决于多种因素,如参数表示的精度、是否进行了压缩等),但可以根据其参数量来估算一个…

基于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. 前导列匹配(典型的命中索引场景) 索引结…