QtC++ 技术分析3 - IOStream
目录
- iostream
- scanf/printf
- iostream 整体架构
- 流相关类
- 流缓冲区
- 模板特化后整体结构
- 文件流
- 文件流对象创建
- 常见文件流操作
- 输出格式设定
- 文件流状态
- 字符串流
- 字符串流内部缓冲区
- 字符串流使用
- 流缓冲区
- 用户自定义 IO
iostream
scanf/printf
几种常见的输入输出流函数
scanf从键盘接收输入数据printf向屏幕输出数据fscanf从文件输入数据fprintf向文件输出数据sscanf从内存块读取数据sprintf向内存块输出数据。
C 语言输入输出方法存在这些缺点:
无法在编译阶段检查 scanf/printf 函数组参数的错误;无法对 scanf/printf 函数组的接口进行扩展以处理新的数据类型;scanf/printf 函数组的执行速度慢;scanf/printf 函数组所占用的空间无法被优化。
iostream 整体架构
iostream 包括以下三个层次

输入输出特性
- 无论是输出还是输入操作,都经由一个缓冲区进行处理
- 输出时,数据先写入到缓冲区,直到缓冲区满,其中的数据才会被真正写入到外部设备
- 即便仅输入一个字符,也必须经过缓冲区
流相关类
iostream 整体架构图

charT 表示流中字符的类型
模板参数 traits 表示字符的特征
模板参数 allocator 表示堆管理器,该参数的默认值是系统的堆管理器
类模板 basic_ios 负责管理流缓冲区。它含有一个指针,指向流缓冲区。它还含有一个状态信息,来记录流缓冲区中数据的完备性。
类模板 basic_istream 以及 basic_ostream 分别负责数据的输入和输出
basic_iostream 通过继承这两个类模板,既能处理输入也能处理输出。
类模板 basic_istringstream 从一个类型为 basic_string 的字符串对象读取数据
类模板 basic_ostringstream 则向这种类型的字符串对象输出数据
流缓冲区
basic_ios 派生类中的缓冲区指针会指向 basic_streambuf 或者 basic_filebuf 的对象
抽象类型 basic_streambuf 不含有任何关于外部设备的信息
类模板 basic_filebuf 将输出缓冲区中的数据写入文件,或者将文件中的数据读取到输入缓冲区
模板特化后整体结构
iostream 将所有的 charT 特化为 char ,所有的 traits 特化为 char_traits< char>
iostream 还将所有的 charT 特化为 wchar_t,所有的 traits 特化为char_traits<wchar_t >
文件流
basic_ifstream 以及 basic_ofstream 分别负责文件的输入和输出
basic_fstream 能够对文件进行输入和输出双向的操作
文件流对象创建
fstream 代码实例:创建一个文件流对象 fs,在文件“test.txt”的尾部写入数据
ios_base 中定义了 6 个常量
- in 表示读一个文件
- out 表示写一个文件
- app 表示仅在一个文件的末尾写入
- trunc 表示清空文件内容
- binary 表示以二进制方式访问一个文件
- ate(是 at end 的缩写)表示初始的读/写位置为文件的末尾。
fstream fs("test.txt", ios_base::out | ios_base::app)
当读入文件(in 模式)则要求文件必须存在;
当写入文件(out 模式)指定文件可不存在,由系统新建一个;
常见文件流操作
一般的,你可以直接使用 << 或者 >> 执行输入输出操作
下面代码展示使用 fstream 对文件读写流程
#include <iostream>
#include <fstream>
#include <string>
using namespace std;int main()
{// 打开文件,以输入、输出和追加的方式打开fstream fs("data\\test.txt", ios_base::in | ios_base::out | ios_base::app);// 检查文件是否成功打开,如果没有成功打开则输出错误信息并退出程序if (!fs) {cerr << "cannot open test.txt";exit(-1);}// 向文件中写入字符串 "hello, world\n"fs << "hello, world\n";// 将文件读写位置重新定位到文件开头fs.seekg(0);// 定义字符串变量 s,从文件中读取一个单词并存储到字符串 s 中string s;fs >> s;// 输出字符串 scout << s;
}
常用 basic_istream 中的 getline()获取一整行的文本内容
输出格式设定
hex、oct、dec 分别将输出的数制设置为十六进制、八进制和默认的十进制
cout << hex << 20;
setw,流操作符,设置其后紧接着的那个数据的输出宽度
cout << swtw(4) << 3;
setprecision(m) 将设置小数点及其后面的数字占用 m 个字符的位置
boolalpha 流操作符,可以让 bool 类型数据输出形式为 true 何 false 而不是 1 和 0
left 流操作符,结果左对齐
文件流状态
C++流提供了以下的几个成员函数来返回一个流的状态信息
- eof()。如果输入流已经到达末尾,该函数返回真。
- bad()。如果用户试图对一个流对象执行非法操作,比如将文件指针移动到文件尾部之后的某个地方,该函数返回真,表示流对象被破坏了。
- fail()。如果施加到流的某个操作未能成功,比如一个输入流对象希望读取一个整数但是实际的输入数据却是一个字符串,该函数将返回真。
- good()。当以上条件都没有出现时,该函数返回真。
流使用者可以主动地分析流中的数据,调用成员函数 setstate()来设置流的状态信息
char ch;
if ((ch = ifs.get()) != '<' )is.setstate( ios_base::failbit );
字符串流
介绍类模板 basic_stringstream 读取和输出到一个 basic_string 对象的流程
字符串流内部缓冲区
stringstream 对象的流缓冲区指针指向一个 stringbuff 对象,该对象管理一个内部的字符缓冲区
内部字符缓冲区有两个指针:读取操作会后移“读指针”,而写入操作会后移“写指针”
字符串流使用
// istringstream使用
int i;
if (istringstream(argv[1]) >> i)// ostringstream使用
struct date {int day,month,year;
} today = {9,3,2011};
ostringstream ostr; ①
ostr << today.month << '-' << today.day <<'-' << today.year; ②
if (ostr)cout<<ostr.str(); ③
流缓冲区
可以令多个流对象共享一个流缓冲区
#include <iostream>
#include <fstream>
using namespace std;
int main()
{ofstream dec_stream( "demo.txt" ); ①ostream hex_stream( dec_stream.rdbuf() ); ②hex_stream << hex << showbase;int a[4] = {12, 34, 56, 78};for (int i=1; i<4; i++){dec_stream << a[i]; ③hex_stream << "[" << a[i] << "] "; ④}return 0;
}
流缓冲区可以执行复制操作
#include <fstream>
#include <sstream>
#include <iostream>
using namespace std;int main()
{// 打开红楼梦文本文件ifstream fs("hong_lou_meng.txt");// 将文件内容读取到stringstream对象中stringstream ss;ss << fs.rdbuf(); // ①// 将stringstream对象中的内容转为字符串类型string str = ss.str(); // ②// 查找字符串 "黛玉" 最后一次出现的位置string::size_type pos = str.rfind("黛玉");// 将stringstream对象的读写位置定位到 "黛玉" 最后一次出现的位置ss.seekg(pos);// 读取一行字符串,即 "黛玉" 最后一次出现的那句话string one_line;getline(ss, one_line);// 输出 "黛玉" 最后一次出现的那句话cout << one_line << endl;return 0;
}
用户自定义 IO
通过定义类,附加两个友元函数,并利用 ostream 和 instream ,即可实现自定义 IO
#include <iostream> //包含输入输出流库
using namespace std; //使用标准命名空间class CPoint { //定义CPoint类
public:CPoint(double p_x=0, double p_y=0) {x=p_x; y=p_y;}; //构造函数friend ostream& operator << (ostream&, const CPoint&); //输出运算符重载函数的友元声明friend istream& operator >> (istream&, CPoint&); //输入运算符重载函数的友元声明
private:double x,y; //CPoint对象的x和y坐标
};ostream& operator <<( ostream& os, const CPoint& point ) //输出运算符重载函数的实现
{os << "<" << point.x << "," << point.y << ">"; //输出CPoint对象的坐标return os; //返回输出流对象
}istream& operator >>(istream& is, CPoint& point) //输入运算符重载函数的实现
{char ch;is >> ch;if ( ch!='<'){ //如果输入不是以 '<' 开始,则输入失败is.setstate( ios_base::failbit ); //设置输入流的状态为失败return is; //返回输入流对象}is >> point.x >> ch >> point.y >> ch; //输入CPoint对象的坐标
}int main() //主函数
{CPoint p; //定义一个CPoint对象pwhile ( cin>> p ) //从标准输入流中读取CPoint对象,如果读取成功则进入循环cout << p << endl; //输出CPoint对象p,然后换行
}
相关文章:
QtC++ 技术分析3 - IOStream
目录 iostreamscanf/printfiostream 整体架构流相关类流缓冲区 模板特化后整体结构文件流文件流对象创建常见文件流操作输出格式设定文件流状态 字符串流字符串流内部缓冲区字符串流使用 流缓冲区用户自定义 IO iostream scanf/printf 几种常见的输入输出流函数 scanf 从键盘…...
2023年Q2京东环境电器市场数据分析(京东数据产品)
今年Q2,环境电器市场中不少类目表现亮眼,尤其是以净水器、空气净化器、除湿机等为代表的环境健康电器。此外,像冷风扇这类具有强季节性特征的电器也呈现出比较好的增长态势。 接下来,结合具体数据我们一起来分析Q2环境电器市场中…...
TCP/UDP的首部
TCP/UDP首部信息 TCP首部第一个4字节第二个4字节与第三个4字节第四个4字节第五个4字节选项最大报文段长度(MSS)选项窗口扩大选项时间戳选项 什么时候发送RST包UDP首部 TCP首部 TCP 首部长度为20字节,加上选项部分最大可达60字节。 第一个4…...
Kubernetes(K8s)从入门到精通系列之四:K8s的基本概念和术语之集群类
Kubernetes K8s从入门到精通系列之四:K8s的基本概念和术语之集群类 一、Master二、Node三、命名空间集群表示一个由Master和Node组成的K8s集群。 一、Master Master指的是集群的控制节点。在每个K8s集群都需要有一个或一组被称为Master的节点,来负责整个集群的管理和控制。M…...
黑马头条---day1
手机端查看 docker 容器,镜像操作命令 1、docker删除所有镜像命令 删除所有镜像的命令是Docker中一个非常常见的操作。下面是具体的实现步骤和命令示例: $ docker stop $(docker ps -aq) 停止所有正在运行的容器。 $ docker rm $(docker ps -aq) 删…...
【序列化工具JdkSerialize和Protostuff】
序列化工具对比 JdkSerialize:java内置的序列化能将实现了Serilazable接口的对象进行序列化和反序列化, ObjectOutputStream的writeObject()方法可序列化对象生成字节数组 Protostuff:google开源的protostuff采用更为紧凑的二进制数组&#…...
C++ 多线程编程导论(下)
文章目录 参考资料线程安全(续)门闩与屏障——latch 对象与 barrier 对象门闩(latch)屏障(barrier) 一次性调用——once_flag 对象与 call_once 函数 异步任务未来与承诺——future 对象与 promise 对象fut…...
Java并发系列之一:JVM线程模型
什么是线程模型: Java字节码运行在JVM中,JVM运行在各个操作系统上。所以当JVM想要进行线程创建回收这种操作时,势必需要调用操作系统的相关接口。也就是说,JVM线程与操作系统线程之间存在着某种映射关系,这两种不同维…...
容灾独家技术揭秘:HyperBDR无主机数据同步技术
01、一对一单机热备-传统灾备方式 单机热备是一种备份解决方案,它使用两台服务器来确保高可用性,是市场上最为常见的灾备模式。 在单机热备中,一台主服务器和一台备用服务器保持同步,以确保在主服务器出现故障或宕机时可以立即切换…...
FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结
FANUC机器人SRVO-050碰撞检测报警和SRVO-053干扰值过大故障报警总结 前面和大家分享了关于SRVO-050碰撞检测报警和SRVO-053干扰值过大的原因分析以及处理方法,感兴趣的朋友可以参考以下链接中的内容: FANUC机器人SRVO-050碰撞检测报警原因分析及处理对策...
微信如何提高回复信息速度?
规范流程话术有什么用?为了提高回复客户的效率和质量,可以事先设计好的一套标准化的对话模板。它通常包括多个环节和问题,帮助客服人员或销售人员在与客户沟通时,按照标准化的流程进行,以提高工作效率和客户满意度。 如…...
模拟Stevens Lewis描述的小型飞机纵向动力学的非线性动态反演控制器研究(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 💥1 概述 针对Stevens和Lewis描述的小型飞机纵向动力学的非线性动态,研究非线性动态反演控制器可以是一个有趣的课题。动态反演控制器的目标…...
【C++从0到王者】第十二站:vector基本使用
文章目录 一、vector基本介绍二、vector的基本使用三、vector\<char> 和string的区别四、vector接口介绍1.vector的模板参数2.构造函数3.迭代器4.size和max_size5.resize和reserve6.operator[]和at7.front和back8.data9.push_back和pop_back10.insert和erase11.assign12.…...
了解Unity编辑器之组件篇Miscellaneous(九)
一、Aim Constraint:是一种动画约束,用于使一个对象朝向另一个对象或一个指定的矢量方向 Activate按钮:用于激活或停用Aim Constraint。当Aim Constraint处于激活状态时,其约束效果将应用于目标对象。 Zero按钮:用于将…...
自动驾驶小车
开发自动驾驶小车涉及多个方面,包括硬件和软件。下面是一般情况下开发自动驾驶小车的主要步骤: 确定需求和功能:明确您的自动驾驶小车的目标和应用场景,确定需要的功能和特性,例如感知、决策、控制等。 硬件选择和安…...
机器学习深度学习——多层感知机的从零开始实现
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——多层感知机 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 为…...
Redis的基本使用命令
Redis的使用命令 Redis是一个开源的使用ANSI C编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash…...
Ts入门到放弃
TS 的核心能力在于给 JS 提供静态类型检查,是有类型定义的 JS 的超集,包括 ES5、ES5 和其他一些诸如泛型、类型定义、命名空间等特征的集合。 本次仅会针对类型声明部分配合示例进行着重介绍,更详细的内容以及特性可以查看 Typescript handb…...
黑客技术(网络安全)学习笔记
一、网络安全基础知识 1.计算机基础知识 了解了计算机的硬件、软件、操作系统和网络结构等基础知识,可以帮助您更好地理解网络安全的概念和技术。 2.网络基础知识 了解了网络的结构、协议、服务和安全问题,可以帮助您更好地解决网络安全的原理和技术…...
Cloud Kernel SIG 月度动态:支持龙芯和申威架构,合入两个内存新特性
Cloud Kernel SIG(Special Interest Group):支撑龙蜥内核版本的研发、发布和服务,提供生产可用的高性价比内核产品。 01 SIG 整体进展 Cloud Kernel 开始支持龙芯和申威架构。 合入两个内存新特性:MEMCG LRU LOCK 和…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
SpringCloudGateway 自定义局部过滤器
场景: 将所有请求转化为同一路径请求(方便穿网配置)在请求头内标识原来路径,然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
