C++——IOStream

news2024/11/26 4:42:37


什么是IO?

C语言和C++,我们其实已经接触到了两个IO的概念

#include<stdio.h>
#include<iostream>

iostream,便是IO流,其中I表示in,O表示out,代表着用户的输入和终端的输出。在之前的C++语法中,我们都很少去考虑输入输出,而是直接用固定的测试用例来验证结果。但是对于大多数的程序都是传递给用户进行互动,IO流在实际中才是最应该考虑到的问题。


什么是流?

和我们常了解的水流电流等一样,流是一段连续且有方向的概念。其中IO是流的两个方向,In是用户不断向内存内输入数据,Out是终端向外输出数据。但是流是连续的,数据捕获却并非连续,用户可以不断向内存中输入,但是程序只会捕获其需要的片段,剩下没有被捕获到的数据留在缓冲区待命,一直到程序再次捕获缓冲区的数据。


C++中的IO流

C语言里,最常用的IO流是熟知的printf和scanf,其中scanf和printf便分别表示了I和O。C++中也可以使用这两个来实现IO,但是为什么还要再另外写出cout和cin来代替C语言的IO?

C语言的IO最难用的地方,便是需要用特定的占位符来表示数据。但是有了泛型,我们很多时候并不知道他到底是个什么类型,于是占位符常常会出现一些奇奇怪怪的bug。

于是,C++为了解决这个问题,便利用了面向对象来重新实现了IO流,其中最大的改变便是可以自动识别出IO的类型,不需要用占位符来规定数据的类型。虽然这样有好有坏,但是printf又不是被禁用了,不好用的时候我们不用不就好了。

标准IO流

 C++标准库中提供了4个全局的IO流对象

  • cin,标准输入,将数据从键盘输入到内存
  • cout,标准输出,数据从内存输出到控制台
  • cerr,标准错误的输出
  • clog,日志输出

其中,cin的输入并非直接提取当时键盘的输入,而是键盘会输入到缓冲区,而cin从缓冲区中提取数据,剩下未被提取到的数据会留在缓冲区等待被下一次的提取。

并且,如果我们输入的对象是字符或者字符串,则空格和回车无法通过cin被输入,因为空格和回车会被作为分隔符,表示一串数据的输入完毕。

此时,便会有我们在做IO时经常会面临的一串代码:

while(cin>>a)
{
    //...
}

做IO时我们也许并不会考虑到这个问题:循环是如何判断中止的?

我们都知道,对于一个流插入,其返回值是一个istream对象;同样,对于一个流提取,其返回值是一个ostream对象。对象转换为需要被判断的bool值,编译器是没有办法完成这一操作的。于是,STL中为其又加入了一个新语法——类型转换的重载。

operator bool( )

operator bool,其作用在需要被转换的时候,编译器会自动去调用这个重载函数,将其转换为合适的类型。这一重载函数没有返回值类型,或者说其返回值强制是被重载的类型,所以在其前不需要加上返回值的类型。

class A
{
public:
	A(int a)
		:_a(a)
	{}

	//打破了往常的0为false,其他为true,重新定义了true和false的判断方法
	operator bool()
	{
		if (_a > 10)
			return false;
		else
			return true;
	}
private:
	int _a;
};

int main()
{
	A a1(20);
	A a2(1);

	//调用了operator bool函数来进行类型的转换
	cout << (bool)a1 << endl;//false
	cout << (bool)a2 << endl;//true
}

其最大的意义便是修改了固定空为false其余为true的判断方式,从而让bool判断更加便利 

并且,流插入和流提取并不是当空即为终止,其必须要通过特定的特征按键才会终止(比如Windows下的ctrl+Z),通过这种方式修改了true和false的判断方式,从而可以人为去规定流插入和流提取的终止。 

同样,不仅只有bool可以进行运算符重载,其他类型也可以进行运算符重载,在需要的时候大大提高程序的灵活性。

文件IO流

文件IO流同样也存在着三个对象:

  •  ifstream,只输入用
  •  ofstream,只输出用
  • fstream,输入和输出

但是文件的读写有着两种方式:二进制文件和文本文件。用最简单的方式来区别两种文件:
二进制文件类似于浅拷贝,直接将所有数据原封不动拷贝到文件中;
而文本文件则是深拷贝,只将有效数据拷贝到文件里。 

举个例子,对于一个单链表,我们将其存入文件中

如果采用二进制文件,则是直接暴力复制其里面所有的数据,包括其头结点所存的值、头结点的next指针等值的二进制机器码,读取的时候也是读取二进制数据码。
但是,程序每次运行时地址是不同的,也就是复制了指针,再去访问那个指针则是一个野指针,读取到的数据是无效的。

如果采用文本文件,则需手动编写读写的方式,手动遍历每个结点,然后以字符串的形式将每个结点所存的值写入文本中,读取的时候也需要手动编写读取的方式,将文本中的字符串依次转换为合适的类型,重新装入链表的每一个结点里。

而文本操作的函数,因为在不同的库中可能会产生差异,并且大多数可能会自己去实现,所以需要用的时候查库便可以了。


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

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

相关文章

前端使用css去除input框的默认样式

关键点&#xff1a; /* 关键点&#xff0c;让输入框无边框 */outline:none; border:none; 1.效果图 2.html <div class"container"><input type"text" placeholder"请输入用户名"><input type"text" placeholder&q…

【学习】focal loss 损失函数

focal loss用于解决正负样本的不均衡情况 通常我们需要预测的正样本要少于负样本&#xff0c;正负样本分布不均衡会带来什么影响&#xff1f;主要是两个方面。 样本不均衡的话&#xff0c;训练是低效不充分的。因为困难的正样本数量较少&#xff0c;大部分时间都在学习没有用…

【B站最全唱歌教学】逼自己30天练完这些,唱歌变态好听!从零基础入门让你唱歌彻底变好听,学不会退出音乐圈!第一天

打基础 腹式呼吸&#xff08;口鼻同吸&#xff09;速度要快&#xff0c;练习狗哈气吐气吐快了容易没气&#xff0c;练吐丝&#xff08;男生&#xff1a;40s&#xff0c;女生&#xff1a;30s&#xff09;&#xff0c;要用腹式呼吸&#xff0c;而不是胸式呼吸&#xff08;肺活量…

35岁了,怎么办?

从裁员联想到程序员的转折点——35岁。35岁是一个尴尬的年纪&#xff0c;这个阶段&#xff0c;我们好像失去任性的资本&#xff0c;却也不像更年长的人一样通达而不惑。在这个不上不下的年纪&#xff0c;35岁有着无尽的烦恼&#xff1a;高昂的房价、上有老下有小的家庭、被裁员…

[java数据结构] 栈(Stack)和队列(Queue)

目录 (一) 栈(Stack) 1. 栈的概念 2. 栈的常见的方法 3. 栈的使用 4. 栈的模拟实现 (二) 队列(Queue) 1. 队列的概念 2. 队列常见的方法 3. 队列的使用 5. 队列的模拟实现 6. 循环队列 总结 (一) 栈(Stack) 1. 栈的概念 栈&#xff1a;一种特殊的线性表&#xff0…

webserver 之 线程同步 线程池(半同步半反应堆)

目录 &#x1f402;前言 &#x1f351;B / S 模型 &#x1f418;线程同步机制 &#x1f33c;概念 &#xff08;1&#xff09;RAII &#xff08;2&#xff09;信号量 &#xff08;3&#xff09;互斥量 &#xff08;4&#xff09;条件变量 &#x1f33c;功能 &#xf…

git merge和git rebase区别

具体详情 具体常见如下&#xff0c;假设有master和change分支&#xff0c;从同一个节点分裂&#xff0c;随后各自进行了两次提交commit以及修改。随后即为change想合并到master分支中&#xff0c;但是直接git commit和git push是不成功的&#xff0c;因为分支冲突了【master以…

JAVA输入任意一个数字,实现递减求和(计算任意整数n的和)

摘要&#xff1a;本文介绍了使用Java编程语言计算任意整数n及其之前所有整数的和的示例代码。代码使用了Scanner类来读取用户输入的整数值&#xff0c;并通过循环计算出和结果并生成计算公式字符串。 内容&#xff1a; 在这个示例中&#xff0c;我们将展示如何使用Java编程语言…

白酒:酿造过程中的微生物作用与控制

云仓酒庄豪迈白酒的酿造是一个复杂的过程&#xff0c;其中微生物的作用与控制是关键环节。在这个过程中&#xff0c;微生物不仅是发酵的驱动者&#xff0c;也是形成云仓酒庄豪迈白酒与众不同风味的重要因素。 在制曲环节&#xff0c;传统的人工踩曲方式被采用。这种方式通过调节…

宠物互联网医院系统:数字化呵护你爱宠的新时代

宠物互联网医院系统正在为宠物主人提供一种前所未有的数字化健康护理体验。通过结合创新技术&#xff0c;这一系统旨在让宠物医疗变得更加便捷、智能和个性化。让我们深入探讨宠物互联网医院系统的技术核心&#xff0c;以及如何应用代码为你的爱宠提供最佳关怀。 1. 远程医疗…

web开发学习笔记(14.mybatis基于xml配置)

1.基本介绍 2.基本使用 在mapper中定义 在xml中定义&#xff0c;id为方法名&#xff0c;resultType为实体类的路径 在测试类中写 3. 动态sql&#xff0c;if和where关键字 动态sql添加<where>关键字可以自动产生where和过滤and或者or关键字 where关键字可以动态生成whe…

【产品设计】详细的B端筛选设计

在实际的工作中&#xff0c;可能会遇到各种筛选类型&#xff0c;不同的筛选类型对应的排版布局各不相同&#xff0c;实际业务中的使用场景也具有差异。 对于产品而言&#xff0c;只有参与的项目越多&#xff0c;设计和思考的场景越全面&#xff0c;了解的产品越多&#xff0c;才…

mac绘画软件有哪些?Mac绘画软件大揭秘

mac绘画软件有哪些&#xff1f;在Mac平台上&#xff0c;有许多优秀的绘画软件可供选择。这些软件不仅功能强大&#xff0c;而且界面设计简洁&#xff0c;使得创作过程更加顺畅。今天&#xff0c;我们将为你介绍一些知名的Mac绘画软件&#xff0c;让你深入了解这个充满创意的世界…

【网络安全】-基本工具msf

secure 1、有此漏洞的目标主机2、无此漏洞的目标主机&#xff08;常用&#xff09; ps.本着兴趣爱好&#xff0c;加强电脑的安全防护能力&#xff0c;并严格遵守法律和道德规范。msf&#xff08;metasploit framework&#xff09;是一个开源的渗透测试框架&#xff0c;用于开发…

python丰富的任务进度显示

pip install txdpy 安装 txdpy from txdpy import progbar 导入 progbar progbar()函数传入一个可遍历对象&#xff0c;返可迭代对象 from txdpy import progbar from random import uniform from time import sleepfor i in progbar(range(4651)):print(f第{i}条任务)…

在ESP32 Arduino框架上实验FreeRTOS:多任务操作系统的简介与应用

FreeRTOS 介绍 实时操作系统&#xff08;RTOS&#xff09;&#xff1a; 实时操作系统是一种专为实时应用程序设计的操作系统。实时应用程序对任务的响应时间有严格的要求&#xff0c;因此实时操作系统必须能够在预定的时间内完成任务的调度和执行。这与通用操作系统&#xff…

Unity 桥接模式(实例详解)

文章目录 示例1&#xff1a;角色与装备系统示例2&#xff1a;UI控件库示例3&#xff1a;渲染引擎模块示例4&#xff1a;AI决策树算法示例5&#xff1a;物理模拟引擎 在Unity游戏开发中&#xff0c;桥接模式&#xff08;Bridge Pattern&#xff09;是一种设计模式&#xff0c;它…

语义分割常用评价指标

在图像处理领域中&#xff0c;语义分割是很重要的一个任务。在实际项目开发中,评估模型预测效果以及各指标的含义对于优化模型极为重要。 本文将主要评价指标的计算算法进行了详细说明,并加上注释解释每个指标的含义。这对理解各指标背后的数学原理以及能否在实践中应用或许有…

【MATLAB基础绘图第20棒】云雨图

MATLAB绘制云雨图 云雨图(Raincloud plots)MATLAB绘制云雨图横向云雨图竖向云雨图 参考 云雨图(Raincloud plots) 云雨图&#xff08;Raincloud plots&#xff09;其实是可以看成核密度估计曲线图、箱形图和抖动散点图的组合图&#xff0c;清晰、完整、美观地展示了所有数据信…

数组与 Web 程序打包

5. 数组 在Java中&#xff0c;数组是一种用于存储相同类型元素的数据结构。以下是如何定义和赋值Java数组的基本方法&#xff1a; 1. 定义数组&#xff1a; 一维数组&#xff1a; // 语法&#xff1a;elementType[] arrayName; int[] intArray; // 声明一个整型数组&#…