C++——IOStream


什么是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;elsereturn true;}
private:int _a;
};int main()
{A a1(20);A a2(1);//调用了operator bool函数来进行类型的转换cout << (bool)a1 << endl;//falsecout << (bool)a2 << endl;//true
}

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

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

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

文件IO流

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

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

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

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

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

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

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


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

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

相关文章

五、Flask学习之MySQL

五、Flask学习之MySQL 1. 下载MySQL 下载教程&#xff1a;MySQL安装及可视化工具SQLyog下载 2.常用指令 2.1. 查看已有数据库 show databases;2.2. 创建数据库 create database 名字 DEFAULT CHARSET utf8 COLLATE utf8_general_ci;2.3. 删除数据库 drop database 名字;…

《动手学深度学习(PyTorch版)》笔记4.4

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…

mcu短时间内发生多次中断,如何解决中断丢失问题?

问题 嵌入式开发中&#xff0c;如果中断A的处理函数执行时间长&#xff0c;某段时间内&#xff0c;快速来了2个中断A(例如&#xff1a;外部管脚输入信号变化)&#xff0c;则会导致第2个中断丢失。 我有几个疑问&#xff1a; 1.目前市面上的芯片&#xff0c;是否支持缓存中断标志…

Java 字符串 09 StringJoiner(可以指定间隔符号,开始符号,结束符号)

创建对象&#xff0c;添加元素&#xff1a; import java.util.Scanner; import java.util.StringJoiner;public class practice{public static void main(String[ ] args){StringJoiner sj new StringJoiner("---");sj.add("aaa").add("bbb")…

web前端项目-五子棋【附源码】

五子棋&#xff08;人机对弈&#xff09; 本项目【五子棋】是一款人机对弈的策略型棋类游戏。可以选择落子方&#xff1b;游戏难度和是否显示落子次序。游戏双方分别使用黑白两色的棋子&#xff0c;在棋盘直线与横线的交叉点上进行对弈。五子棋可以促进大脑发育、提高思维能力…

快速上手!使用Docker和Nginx部署Web服务的完美指南

前言 Docker是一种容器化技术&#xff0c;它可以将应用程序及其依赖项打包到一个独立的、可移植的容器中。这意味着开发人员可以在任何环境中轻松部署和运行他们的应用程序&#xff0c;而无需担心环境差异和依赖问题。而Nginx则是一款高性能的Web服务器和反向代理服务器&#x…

【学网攻】 第(9)节 -- 路由器使用以及原理

系列文章目录 目录 系列文章目录 文章目录 前言 一、路由器是什么&#xff1f; 二、实验 1.引入 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交换机配置聚合端口【学网攻】 第(4)节 -- 交换机划分Vlan…

微信小程序(十三)生命周期-更新应用提醒

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.onLaunch用法 2.onShow用法 3.onHide用法 4.应用更新API的调用模板 源码&#xff1a; App({//小程序初始化时触发&#xff0c;全局只触发一次onLaunch(option) {//可以获取场景值和启动参数&#xff0c;eg.opt…

【java面试】常见问题(超详细)

目录 一、java常见问题JDK和JRE的区别是什么&#xff1f;Java中的String类是可变的还是不可变的&#xff1f;Java中的equals方法和hashCode方法有什么关系&#xff1f;Java中什么是重载【Overloading】&#xff1f;什么是覆盖【Overriding】&#xff1f;它们有什么区别&#xf…

深入理解STM32中断处理机制

深入理解STM32中断及其使用方法&#xff08;基于HAL库&#xff09; STM32微控制器作为一款强大的嵌入式系统芯片&#xff0c;在各种应用中都需要使用中断来实现实时响应和处理各种事件。本文将深入讨论STM32中断的概念、HAL库的中断处理机制以及如何在STM32CubeMX中配置和使用…

【昕宝爸爸小模块】什么是POI,为什么它会导致内存溢出?

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

时间编程相关的API

1》time -- 获取日历时间 日历时间&#xff1a;1970年1月1日距离现在的秒数 #include <time.h> time_t time(time_t *timer): 获取当前的系统时间&#xff0c;并以time_t类型返回。 2》将日历时间转化为本地时间 localtime #include <time.h> struct tm *localtim…

【CentOS】Linux 文件权限与权限修改

目录 1、Linux 中的文件属性 2、如何修改文件属性与权限 3、目录权限与文件权限的区别 4、Linux 中的文件扩展名 用户与用户组是Linux文件权限的重要组成部分。 首先&#xff0c;一定要明确用户与用户组的概念&#xff1a; Linux 一般将文件可读写的身份分为三个类别&#…

亚马逊测评,完善的自养号系统需要具备哪些要求

在亚马逊等跨境电商平台的严格审查下&#xff0c;许多卖家和买家都遭到了封号。这些封号事件对依赖线上销售的小型卖家造成了巨大的冲击。我们发现大部分账号被封的原因在于底层环境搭建不当。 无论是在亚马逊还是其他跨境电商平台&#xff0c;如ebay、速卖通、虾皮、Lazada等…

Docker深入解析:从基础到实践

Docker基础知识 Docker是什么&#xff1a;定义和核心概念解释 Docker是一个开源项目&#xff0c;它诞生于2013年&#xff0c;旨在自动化应用程序的部署过程&#xff0c; 让应用程序能够在轻量级的、可移植的、自给自足的容器中运行。这些容器可以在几乎任何机器上运行&#xf…

顶顶通呼叫中心中间件利用自动外呼进入机器人的压力测试配置流程

文章目录 前言呼入进入机器人配置流程创建线路创建线路组呼入配置 创建自动外呼任务1. 实现“一端放音&#xff0c;另一端进入机器人”操作创建拨号方案—“模拟放音”呼叫路由—“internal”启用拨号方案—“模拟放音”队列外呼配置 2. 实现“两端都进入机器人”操作队列外呼配…

线扫相机使用教程

一.线扫相机的采集原理 在现有的工业 2D 相机中&#xff0c;主要有两种类型的相机&#xff0c;面阵相机和线扫相机。这两种相机有其 各自的特点。 面阵相机&#xff1a;主要用于采集较小尺寸的产品&#xff0c;特别是长度方向较小的产品。其采集原理是通过 单次或多次曝光&…

Docker容器操作 Docker创建并运行Nginx、Redis

容器操作的命令如图&#xff1a; 容器命令 # 创建并运行一个容器&#xff0c;运行成功后会返回容器id docker run# 暂停&#xff0c;将容器挂起&#xff0c;内存暂存&#xff0c;CPU不再执行 docker pause # 恢复运行&#xff0c;内存恢复&#xff0c;CPU恢复 docker unpause#…

【深度学习】sdxl中的 tokenizer tokenizer_2 区别

代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个分词器 tokenizer 和 tokenizer_2&#xff1f; 在仔细阅读这些代码后&#xff0c;我们了解到 tokenizer_2 主要是用于 refiner 模型的。 #…

12000 份发财红包封面免费送

发财红包封面又来啦 寓意新年加薪发财 两个红包封面&#xff0c;各6000份&#xff0c;共12000份 剩余额度全打光&#xff0c;够诚意吧 附送原图&#xff08;阿里通义万相生成&#xff09; 祝大家 春节快乐&#xff0c;新年涨薪发财 龙年行大运&#xff0c;万事皆如愿 使用说明 …