流类库与输入输出

news2024/11/9 6:05:10

来源:《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.coloradmin.cn/o/2236398.html

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

相关文章

k8s图形化显示(KRM)

在master节点 kubectl get po -n kube-system 这个命令会列出 kube-system 命名空间中的所有 Pod 的状态和相关信息,比如名称、状态、重启次数等。 systemctl status kubelet #查看kubelet状态 yum install git #下载git命令 git clone https://gitee.com/duk…

理解鸿蒙app 开发中的 context

是什么 Context是应用中对象的上下文,其提供了应用的一些基础信息,例如resourceManager(资源管理)、applicationInfo(当前应用信息)、dir(应用文件路径)、area(文件分区…

ML1:sklearn env

sklearn: 中文参考: https://scikit-learn.cn/stable/modules/linear_model.html#ordinary-least-squares https://scikit-learn.org.cn/view/4.html ——》为主,不懂地方参考上面中文以及下面英文 英文参考: https://scikit…

五分钟入门双拼!

‍这是从零开始学双拼的第一篇:概述 双拼的原理 如果你使用全拼,想要完整敲出一个字的读音,需要敲出这个字拼音的每个字母。 虽然简拼能简化一点步骤,但除非是很常见的成语、俗语,否则重码率很高,选词很…

基于STM32的智能充电桩:集成RTOS、MQTT与SQLite的先进管理系统设计思路

一、项目概述 随着电动车的普及,充电桩作为关键基础设施,其智能化、网络化管理显得尤为重要。本项目旨在基于STM32微控制器开发一款智能充电桩,能够实现高效的充电监控与管理。项目通过物联网技术,提供实时数据监测、远程管理、用…

毕业后如何查找获取文献

当我们毕业后就无法再使用自己学校的数据库资源了,如果需要查找文献该从哪里获取资源呢?下面这个方法很简单而且有效: 一、首先选对科研工具 文献党下载器,把大量数据库资源整合在一起,直接去文献来源数据库查找获取…

串口接收,不定长数据接收

###1.CUBE-MX配置串口 2.我采用串口中断接收,打开中断接口 3.时钟同样8倍频,1分频,使用内部时钟 打开串口中断 main() { __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); // 启用空闲中断__HAL_UART_ENABLE_IT(&huart1, UART_IT_R…

2024 高质量 Java 面试题集锦:高级 Java 工程师面试八股汇总

最近感慨面试难的人越来越多了,一方面是市场环境,更重要的一方面是企业对 Java 的人才要求越来越高了。 基本上这样感慨的分为两类人,第一,虽然挂着 3、5 年经验,但肚子里货少,也没啥拿得出手的项目&#x…

express 使用JWT认证

1、JWT的理解 JWT 的组成部分: 分别是 Header(头部)、Payload(有效荷载)、Signature(签名) 三者之间使用英文的"."分隔, Pyload 部分才是真正的用户信息,他是用户信息经过加密之后生成的字符串 Header 和 Signature 是 安全性相关的部分,只是为了保证 Tok…

linux将mysql加到systemctl命令中

linux中,想将mysql加到systemctl命令中,首先需要确定mysql的安装位置 在/etc/systemd/system目录下新建mysql.service vim /etc/systemd/system/mysql.service 复制如下内容:确保你自己的mysql路径是否正确 [Unit] DescriptionMySQL Server…

【Mac】安装 VMware Fusion Pro

VMware Fusion Pro 软件已经正式免费提供给个人用户使用! 1、下载 【官网】 下拉找到 VMware Fusion Pro Download 登陆账号 如果没有账号,点击右上角 LOGIN ,选择 REGISTER 注册信息除了邮箱外可随意填写 登陆时,Username为…

【VR】PICO 手部追踪 steamvr内无法识别,依旧识别手柄的解决方案

一、问题描述 && 原因分析 1.PICO4 手部追踪 steamvr内无法识别,依旧识别手柄的解决方案 尽管平放(或关闭手柄连接)之后,在 PICO 一体机中进入了手部追踪状态, 但只要进入 steamvr,就无法正确识别…

【LeetCode:64】最小路径和(Java)

题目链接 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,…

VUE项目是如何启动的

当我们执行npm run serve,vue就会启动到这个界面&#xff0c;这个流程是怎么的 下典型的 Vue CLI 项目结构&#xff1a; public/index.html 这是项目的主 HTML 文件&#xff0c;Vue 应用会被挂载到这个文件中的 <div id"app"></div> 元素上。 <!DO…

LeetCode100之旋转图像(48)--Java

1.问题描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例1 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&…

吴恩达深度学习笔记:序列模型(Sequence Models) 1.1-1.2

目录 第五门课 序列模型(Sequence Models)第一周 循环序列模型&#xff08;Recurrent Neural Networks&#xff09;1.1 为什么选择序列模型&#xff1f;&#xff08;Why Sequence Models?&#xff09;1.2 数学符号&#xff08;Notation&#xff09; 第五门课 序列模型(Sequenc…

安装和运行开发微信小程序

下载HBuilder uniapp官网 uni-app官网 微信开发者工具 安装 微信小程序 微信小程序 官网 微信小程序 配置 运行 注意&#xff1a;运行前需要开启服务端口 如果运行看不到效果&#xff0c;设置下基础库选别的版本 配置

Java反射、注解、泛型——针对实习面试

目录 Java反射、注解、泛型什么是反射&#xff1f;反射有什么优缺点&#xff1f;优点缺点 什么是泛型?泛型的优点泛型的实现 泛型怎么使用&#xff1f;泛型类泛型方法泛型接口类型参数命名约定泛型的类型限定泛型的通配符 什么是泛型擦除机制&#xff1f;为什么要擦除&#xf…

【SpringMVC】——Cookie和Session机制

阿华代码&#xff0c;不是逆风&#xff0c;就是我疯 你们的点赞收藏是我前进最大的动力&#xff01;&#xff01; 希望本文内容能够帮助到你&#xff01;&#xff01; 目录 一&#xff1a;实践 1&#xff1a;获取URL中的参数 &#xff08;1&#xff09;PathVariable 2&…

webWorker基本用法

我们都知道js是一个单线程的语言&#xff0c;当线程堵塞时&#xff0c;可能会导致页面无法正常交互&#xff0c;如一些复杂的可视化处理。即使是异步处理&#xff0c;也只是将其暂存到任务队列中去&#xff0c;等主线程执行完后依然会从任务队列中取过去。 为此&#xff0c;js提…