C++ IO流

在这里插入图片描述
请添加图片描述

引言

谈到IO流,有些读者可能脑海中第一个想到的C++程序员的最基础的std::cout , std::cin两个类的使用,对的,这个就是一个典型的IO流,所以逆天我们这篇文章会基于C++ IO流的原理和各种应用场景进行深入的解读。

C语言的数据输出

C语言我们如果进行IO, 我们使用的的scanf和prinf, 或者说我们实际上是通过FILE* 进行IO , 因为了解底层的朋友们应该也知道 ,scanf其实是针对stdinprintf针对stdout的封装。

C语言借助缓冲区实现用户层和设备之间进行IO。
缓冲区的作用

    1. 可以帮助我们屏蔽底层的差异,因为各种操作系统组织数据的方式不同,我们通过缓冲区抹平这种差异。
    1. 使用缓冲区可以实现行读取的操作,因为操作系统没有行的概念,我们可以在缓冲区指定语言级别的规则。

什么是流

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数
据( 其单位可以是bit,byte,packet )的抽象描述。
C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设
备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。

包括TCP协议,其实也是一种流式传输的模型,当然这是后话。

C++流的设计

在这里插入图片描述

标准IO流

在这里插入图片描述

C++ 标准提供了全局的流对象,std::cin, std::cout , std::cerr, std::clog,当然如果理解C语言的读者,当然发现这里就是映射到我们的stdin, stdout, stderr , 如果熟悉操作系统的就会发现就是映射到对应的0, 1, 2 的文件描述符。

注意事项:

    1. 标准流针对标准中内置类型都进行了重载,int , double , 包括std::string。
    1. 输入类型的类型必须和提取的类型一致,不然就会出错,但是我们可以通过修改流的状态来继续进行。
    1. 流重载的状态判断
    // type
    istream& operator(istream&,type) {}
    explicit operator bool() const {} // 
    
    1. 支持重定义自定义类型
    class Data
    {
    public:friend istream& operator<<(istream& in, Data& d);
    private:int data_;
    };istream& operator<<(istream& in, Data& d)
    {in >> d.data_;return in;
    }
    

C++的文件IO流 (fstream)

在这里插入图片描述

C++ 根据文件分为文本文件二进制文件,采用文件流操作文件:

  • ifstream : 读取文件
  • ofstream : 写入文件
  • fstream : 读写文件

那么C++的文件流有什么优势吗?
支持重载就是C++文件流最大的优势,从上面的图中我们可以看到fstream 继承了 iostream , 所有我们可以通过重载iostream的>><< 来进行重载自定义类型

class Data
{
public:friend istream& operator<<(istream& in, Data& d);
private:int data_;
};istream& operator<<(istream& in, Data& d)
{in >> d.data_;return in;
}
int main()
{std::ifstream ifs(filename, std::ios_base::in);Data d;ifs << d;return 0;
}

stringstream

在这里插入图片描述

你以为这样就完了吗,当然没有,还以一种流,字符流(stringstream),他的作用是什么呢?我们不妨使用Linux操作系统下一切皆文件的思想来理解

  • 标准输入输出流:其实本质就是我们将显示器看成一个文件,我们可以全局的std::cin, std::cout, 这就和C语言中我们可以通过fscanf(stdin, …) 来替代scanf,其实就是标准输入输出语言层面的特殊强调。
  • 文件流:当然就是操作文件
  • 字符流: 我们将字符串也想象成一个文件,我们通过<<>>操作字符串。
    实例
    std::string buffer = "1 2 3 4";
    std::stringstream ssm(buffer);
    int a1 , a2, a3 , a4;
    ssm << a1 << a2 << a3 << a4;
    

同时我们还是可以重载iostream的<<>>进行重载。
stringstream的优点:

    1. 更加灵活的操控字符串,平时我们只能通过std::to_string来将转换字符串,但是stringstream支持各种类型(重载后)。
    1. 我们可以发现C++14后的很多类型都不能支持to_string, 比如std::chrono里面的各种类型,但是他们支持iostream , 也就是说我们可以通过stringstream构建字符串。

总结

通过这篇文章,我们提出了C++的一套IO体系,作为一个C++程序员,我们也不能老是只会使用C风格的接口,我们也需要学习C++自己的一套体系,并且C++的IO设计也比C更加灵活,让程序员能够更加灵活的操作IO。

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

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

相关文章

Kafka 3.0零拷贝技术全链路源码深度剖析:从发送端到日志存储的极致优化

在分布式消息系统领域&#xff0c;Kafka凭借高吞吐、低延迟的特性成为行业首选。而零拷贝技术作为Kafka性能优化的核心引擎&#xff0c;贯穿于消息从生产者发送、Broker接收存储到消费者读取的全生命周期。本文基于Kafka 3.0版本&#xff0c;深入源码层面&#xff0c;对零拷贝技…

利益驱动机制下开源AI智能名片链动2+1模式与S2B2C商城小程序的商业协同研究

摘要&#xff1a;在数字经济时代&#xff0c;利益驱动作为用户行为激励的核心逻辑&#xff0c;正通过技术创新实现模式升级。本文基于“利益驱动”理论框架&#xff0c;结合“开源AI智能名片链动21模式S2B2C商城小程序”的技术架构&#xff0c;系统分析物质利益&#xff08;返现…

pytest的前置后置条件

1. setUp()和tearDown() setup()函数主要是进行测试前的初始化工作&#xff0c;比如&#xff1a;在接口测试前面做一些前置的参数赋值&#xff0c;数据库操作等等。 teardown()函数是测试后的清除工作&#xff0c;比如&#xff1a;参数还原或销毁&#xff0c;数据库的还原恢复…

Python 自动化运维与DevOps实践

https://www.python.org/static/community_logos/python-logo-master-v3-TM.png 基础设施即代码(IaC) 使用Fabric执行远程命令 python 复制 下载 from fabric import Connectiondef deploy_app():# 连接到远程服务器with Connection(web-server.example.com, userdeploy,…

css3 文本效果(text-shadow、text-overflow、word-wrap、word-break)文本阴影、文本换行、文本溢出并隐藏显示省略号

1. 文本阴影&#xff08;text-shadow&#xff09; 1.1 基本语法 text-shadow: h-shadow v-shadow blur-radius color;参数说明&#xff1a; h-shadow&#xff1a;必需。水平阴影的位置。允许负值。 正值&#xff1a;向右偏移负值&#xff1a;向左偏移 v-shadow&#xff1a;必…

在Kibana上新增Elasticsearch生命周期管理

技术文章大纲&#xff1a;在Kibana上新增Elasticsearch生命周期管理 引言 Elasticsearch索引生命周期管理&#xff08;ILM&#xff09;是管理索引从创建到删除全周期的核心工具。通过Kibana界面配置ILM策略&#xff0c;可以自动化处理索引的滚动、收缩、冻结和删除等操作&…

从零开始构建Python聊天机器人:整合NLP与深度学习

引言 在人工智能快速发展的今天&#xff0c;聊天机器人已经成为企业与用户交互的重要工具。从客户服务到信息查询&#xff0c;从个人助手到教育辅助&#xff0c;聊天机器人的应用场景越来越广泛。构建一个智能、高效的聊天机器人不仅需要了解自然语言处理&#xff08;NLP&…

光谱相机的多模态成像技术详解

一、技术架构与工作原理‌ 多模态成像通过‌同步集成多种光谱成像技术‌&#xff08;如高光谱多光谱热成像&#xff09;&#xff0c;构建“空间-光谱-时间”三维数据立方体&#xff0c;实现物质成分与动态过程的协同感知。核心架构包含&#xff1a; ‌分光系统‌ ‌液晶可调…

Spring Boot多数据源切换:三种实现方式详解与实战

在复杂业务系统中&#xff0c;多数据源切换已成为必备技能。本文将深入剖析三种主流实现方案&#xff0c;带你从入门到精通&#xff01; 一、多数据源应用场景 读写分离&#xff1a;主库负责写操作&#xff0c;从库处理读请求 多租户系统&#xff1a;不同租户使用独立数据库 …

Kafka性能压测报告撰写

在大数据生态体系中&#xff0c;Kafka以其卓越的高吞吐、低延迟特性&#xff0c;成为消息队列领域的中流砥柱。然而&#xff0c;随着业务规模不断扩张&#xff0c;数据流量日益激增&#xff0c;Kafka的性能表现直接关乎业务系统的稳定运行与效率提升。通过科学严谨的性能压测&a…

使用DevEco Testing快速创建HarmonyOS5单元测试

1.测试环境准备 确保已安装DevEco Studio 5.0在module的build.gradle添加依赖&#xff1a; dependencies {testImplementation org.junit.jupiter:junit-jupiter:5.8.2ohosTestImplementation com.huawei.ohos.testkit:runner:1.0.0.200 }2.创建测试类&#xff08;示例测试计…

开源物联网(IoT)平台对比

一些 开源物联网&#xff08;IoT&#xff09;平台&#xff0c;它们广泛应用于设备管理、数据采集、远程监控和边缘计算等场景&#xff1a; &#x1f31f; 主流开源物联网平台 平台描述技术栈许可证ThingsBoard功能丰富&#xff0c;支持设备管理、遥测数据收集、规则引擎、告警…

插值与模板字符串

背景。表单渲染需要获取对象中属性进行赋值操作。 插值错误使用。以下方举例。其中的placeholder不能被正确渲染。因为Vue 不会解析 {{ }} 在属性中的内容&#xff1b;如果这样写编译会出问题&#xff0c;而且比较难找出是哪的问题 模板字符串。正确做法时使用。模板字符串用…

Luckfox Pico Pi RV1106学习<4>:RV1106的帧率问题

Luckfox Pico Pi RV1106学习&#xff1c;4&#xff1e;&#xff1a;RV1106的帧率问题 1. 背景2. 问题 1. 背景 接上篇。我在应用中创建3个线程&#xff1a; CAM线程&#xff0c;使用V4L2驱动&#xff0c;从 /dev/video11 获取图像。ENC线程&#xff0c;使用硬件编码器&#x…

内测分发平台应用的异地容灾和负载均衡处理和实现思路?

在软件开发过程中&#xff0c;内测分发平台扮演着至关重要的角色。它不仅帮助开发者将应用程序传播给内部测试人员&#xff0c;还负责收集反馈、跟踪错误并改进产品。然而&#xff0c;为了确保一个平稳、连贯的内测过程&#xff0c;对内测分发平台实施异地容灾和负载均衡机制是…

国内用户如何高效升级npm:使用阿里云镜像加速指南

文章目录 引言为什么需要升级npm?环境检查使用阿里云镜像安装nvm配置阿里云镜像加速npm使用nvm安装最新Node.js验证安装结果升级npm到最新版本解决常见问题1. 权限问题2. 镜像源验证3. 项目创建失败创建测试项目总结引言 作为前端开发者,npm(Node Package Manager)是我们日…

LeetCode--34.在排序数组中查找元素的第一个和最后一个位置

解题思路&#xff1a; 1.获取信息&#xff1a; 给定一个非递减顺序的整数数组&#xff0c;要求找出给定元素在该数组中从左往右第一次出现的位置和最后一个出现的位置&#xff0c;即&#xff1a;最右边的位置和最左边的位置 如果不存在该元素&#xff0c;则返回{ -1 , -1 } 限制…

低秩分解的本质是通过基矩阵和系数矩阵的线性组合,以最小的存储和计算代价近似表示复杂矩阵

低秩分解的本质是通过基矩阵和系数矩阵的线性组合&#xff0c;以最小的存储和计算代价近似表示复杂矩阵 flyfish 一、最基础起点&#xff1a;数字与数组 数字与标量&#xff08;Scalar&#xff09; 单独的数&#xff0c;如 1 , 2.5 , − 3 1, 2.5, -3 1,2.5,−3&#xff0c;…

SVN本地使用--管理个人仓库

1.SVN官网下载链接 Download – TortoiseGit – Windows Shell Interface to Git 一路安装即可&#xff0c;安装后在桌面空白处右键菜单可以看到选项即安装成功。 2.建立个人SVN数据库 选择一个磁盘新建一个文件夹&#xff0c;在文件夹中右键创建数据库。 3.上传文件到SVN…

Cloud Automation-Resource optimization, cleanup and dashboard

如何使用Automation Account Run Book实现自动化 1. 什么是 Runbook&#xff1f; Azure Automation Account 中的 Runbook 是一套自动化脚本&#xff0c;用于在云中或混合环境中执行常规任务。Runbook 支持多种脚本语言&#xff0c;包括 PowerShell、Python、Graphical、Powe…