C++:输入流/输出流
C++流类库简介
C++为了克服C语言中的scanf
和printf
存在的缺点。,使用cin/cout
控制输入/输出。
cin
:表示标准输入的istream
类对象,cin
从终端读入数据。cout
:表示标准输出的ostream
类对象,cout
向终端写数据。cerr
:表示标准错误输出(非缓冲方式),导出程序错误信息。clog
:表示标准错误输出(缓冲方式),导出程序错误信息。
为了在程序中使用cin/cout
,必须在程序中包含iostream
库的相关头文件,格式为:#include <iostream>
iostream
类同时从istream
(输入流)和ostream
(输出流)类派生出来,允许双向输入/输出。输入由重载的>>
运算符完成,输出由重载的<<
运算符完成,输入/输出格式为:cin>>变量名
/cout<<变量名
。
除了用户端的输入/输出,C++还提供了文件的输入/输出类:
ifstream
:从istream
派生而来,把文件绑定到程序上输入。ofstream
:从ostream
派生而来,把文件绑定到程序上输出。fstream
:从iostream
派生而来,把文件绑定到程序上输入/输出。
使用iostream
库的文件流,必须包含相关的头文件:#include <fstream>
常用的流类库层次结构如图所示:
ios
类作为流类库的基类,主要派生了istream、ostream
类,由这两个类又派生了很多使用的流类,除ifstream
类、ofstream
类、iostream
类外,还有strstream
(输入/输出串流类)、istrstream
(输入串流类)、ostrstream
(输出串流类)等。下面将对这些流类的作用及用法分别进行介绍。
输入流/输出流格式
基本输出流
C++的ostream
提供了丰富的格式化和误格式化的输出功能:用流插入运算符输出标准数据类型;put
库成员函数输出字符;以八进制、十进制、十六进制数的形式输出数据;以各种精确方式输出浮点型数据;以科学计数法定点输出数据等。
流输出考研用流插入运算符,即重载的<<
(左移位)运算符来完成。<<
运算符左边的操作数时istream
类的一个对象(如cout
),右边可以是C++的合法表达式。
C++还提供了指针预定义输出运算符,允许输出项为显示对象的地址。在默认情况下,地址以十六进制的形式显示。
基本输入流
对应于输出,C++提供了实用的输入功能。类似于输出流中的流插入运算符,输入中引入了流读取运算符,也称为提取运算符。
流输入可以用流读取运算符,即重载的>>
(右移位)运算符来完成。类似于<<
运算符,流读取运算符是双目运算符,左边的操作数是istream
类的一个对象(如cin
),右边的操作数是系统定义的任何数据类型的变量
注意:1. >>
运算符也支持级联输入。在默认情况下,>>
运算符会跳过空格,读入后面与变量类型相应的值。因此,给一组变量输入值时,要用空格或换行符将输入的数值间隔开。
2. 当输入字符串时,>>
运算符会跳过空格,读入后面的非空格符,直到遇到另外一个空格才结束,并在字符串末尾自动放置字符\0
作为结束标志。
3. 输入数据时,不仅检查数据间的空格,还要进行类型检查、自动匹配
格式化输入/输出
在很多情况下,用户希望自己控制输出格式。C++提供了两种格式控制方法:用ios
类成员函数控制格式和用操纵符控制格式。
1. ios
类成员函数控制格式
在ios
类中,格式控制函数主要是通过对状态标志字、域宽、填充字及其精度来完成的。输入/输出格式由一个long int
型的状态标志字确定。在ios
类中public
部分进行了枚举,见下表:
状态标志 | 作用 |
---|---|
skipws | 跳过输入中的空白 |
left | 左对齐格式输出 |
right | 右对齐格式输出 |
internal | 在符号位和数值之间填入字符 |
dec | 十进制数显示 |
oct | 八进制数显示 |
hex | 十六进制数显示 |
showbase | 产生前缀,指示数值的进制基数 |
showpoint | 总是显示小数 |
uppercase | 十六进制数显示0X ,科学计数法显示E |
showpos | 在非负数中显示“+ ” |
boolalpha | 把true 和false 表示为字符串 |
scientific | 以科学记数法形式显示浮点数 |
fixed | 以小数形式显示浮点数 |
unitbuf | 输出操作后立即刷新所有流 |
stdio | 输出操作后刷新stdout 和stderr |
- 设置状态标志
设置状态标志可使用long ios::setf(long flags)
函数,格式为:stream_obj.setf(ios::enum_type);
说明:其中,stream_obj
为被影响的流对象,常用的是cin
和cout
。enum_type
为上表中列举的值。要想设置多个状态,彼此间用运算符“|
”连接(不能连接相反的格式控制符)。 - 清除状态标志
清除状态标志可使用long ios::unsetf(long flags)
,格式为:stream_obj.unsetf(ios::enum_type);
使用方法和ios::setf()
相同。 - 取状态标志
取状态标志用flags()
,在ios
类中重载了两个版本,格式为:long ios::flags();
或long ios::flags(long flag);
前者用于返回当前状态标志字;后者将状态标志字存储在flag
内。需要注意的是,与setf()
设置状态标志字不同,flags()
是取状态标志字的。 - 设置域宽
域宽用于控制输出格式,在ios
类中重载了两个函数控制域宽,原型为:int ios::width();
或者int ios::width(int w);
第一个函数得到当前的域宽了第二个函数用来设置新的域宽,并返回原来的域宽。需要注意的是,所设置的域宽仅仅对下一个输出的操作有效,当完成一次输出操作后,域宽又恢复为0
。 - 设置填充字符
填充字符的作用是,当输出值不满域宽时用设定的字符来填充,默认填充的字符为空字符。实际应用中填充字符函数与设置域宽函数配合使用,否则无空可填,毫无意义。ios
类提供了两个重载的成员函数来操作填充字符,原型为:char ios::fill();
或者char ios::fill(char c);
第一个函数返回当前使用的填充字符;第二个函数设置新的填充字符,并返回设置前的填充字符。 - 设置显示精度
类似地,ios
类也提供了重载的两个函数来显示精度,原型为:int ios::precision();
或者int ios::precision(int num);
第一个函数返回当前数值精度值;第二个函数设置新的显示精度,并返回设置前的精度。
2.操纵符控制格式
使用ios
类成员函数控制输入/输出格式,必须靠流对象来调用,而且不能直接嵌入输入/输出语句中,使用不够方便。C++提供了另外一种控制格式的方法,称为操纵符(控制符)方法,类似于函数的运算符。使用操纵符方法可以嵌入输入/输出语句中。
所有不带参数的操纵符定义在头文件iosream.h
中,带形参的操纵符定义在头文件iomanip.h
中,使用操纵符时需要包含相应的头文件。
提供的操纵符如下便:
标志 | 作 用 |
---|---|
ws | 在输入时跳过开头的空白符,仅用于输入 |
endl | 换行并刷输出流,仅用于输出 |
ends | 插入一个空字符,仅用于输出 |
flush | 刷新一个输出流,仅用于输出 |
skipws | 在输入时跳过输入中的空白符,仅用于输入 |
noskipws | 在输入时不跳过输入中的空白符,仅用于输入 |
internal | 将填充字符加到符号和数值之间 |
dec | 十进制数显示,可用于输入/输出 |
oct | 八进制数显示,可用于输入/输出 |
hex | 十六进制数显示,可用于输入/输出 |
showbase | 产生前缀,指示数值的进制基数 |
noshowbase | 不产生基数前缀 |
showpoint | 总是显示小数 |
noshowpoint | 只有当小数存在时显示小数 |
uppercase | 十六进制数显示0X ,科学计数法显示E |
nouppercase | 十六进制数显示0x ,科学计数法显示e |
showpos | 在非负数中显示“+ ” |
noshowpos | 在非负数中不显示“+ ” |
boolalpha | 把true 和false 表示为字符串 |
noboolalpha | 把true 和false 表示为1和0 |
scientific | 以科学记数法形式显示浮点数 |
fixed | 以小数形式显示浮点数 |
setfill(ch) | 用ch 填充空白字符 |
setprecision(n) | 将浮点数精度设置为n |
setw(w) | 按照w 个字符来读或写数值 |
setbase(b) | 以进制基数b 来输出整数值 |
setiosflags(n) | 设置有n 指定的格式标志 |
resetiosflags(n) | 清除有n 指定的格式标志 |
用户自定义的操纵符控制格式
在C++中,除系统提供的预定义操纵符之外,还允许用户定义操纵符,便于控制一些频繁使用的格式操作,使格式控制更加方便。
自定义输出流操纵符算子函数格式为:ostream &自定义输出操纵符算子函数名(ostream& stream){return stream;}
自定义输入流操纵符算子函数格式为:istream &自定义输出操纵符算子函数名(istream& stream){return stream;}
其他输入/输出函数
get()
和put()
get(char& ch)
从输入流中提取一个字符,包括空白字符,并把它存储在ch
中,返回被应用的istream
对象。此函数在类istream
里。
对应于get()
,类ostream
提供了put(char ch)
,用于输出字符。
gei()
的重载版本:get(char *str, streamsize size,char delimiter='\n');
其中str
代表一个字符数组,用来存放被读取的字符。size
代表可以从istream
中读入字符的最大数目。delimiter
代表如果遇到它就要结束读取字符的动作,delimiter
本身不会被读入,而是留在istream
中,作为istream
的下一个字符。常见的一个错误是,执行第二个get()
时省略delimiter
。getline()
使用get()
输入字符串时,经常忘记去掉delimiter
所以引入函数getline()
,其原型和get()
的重载一样:getline(char *str, streamsize size,char delimiter='\n');
使用getline()
比get()
方便,它除去了delimiter
,而不是将其留作下一个字符。write()
和read()
ostream
类成员函数write()
提供一种输出字符数组的方法。它不是输出“直到终止字符为止”,而是输出某个长度的字符序列,包括空字符。函数原型如下:write(char *str, streamsize size);
其中str
是要输出的字符数组,length
是要显示的字符个数。write()
返回当前被调用的ostream
类对象。
与ostream
类的write()
对应的是istream
类的read()
,原型如下:read(char *str, streamsize size);
read()
从输入流中读取size
个连续的字符,并将其放在地址从str
开始的内存中。gcount()
返回由最会一个read()
调用所读取的字节数,而read()
返回当前被调用的istream
类对象。
用户自定义类型的输入/输出
当实现一个类的类型时,有时需要这个类支持输入和输出的操作,以便可以将类对象嵌入输入或输出流中。对于用户自定义的数据类型的输入/输出,可以通过重载>>
运算符和<<
运算符实现。
重载输出运算符
输出运算符<<
,又称为流插入运算符。定义其重载函数的格式为:
ostream &operator<<(ostream &out, class_name &obj)
{out << obj.data1;out << obj.data2;```return out;
}
函数中第一个参数out
是对ostream
对象的引用,即out
必须是输出流对象;第二个参数是用户自定义要输出的类对象的引用。
<<
运算符不能作为类的成员函数,只能作为友元函数(要访问类的私有成员)来实现。
重载输入运算符
输入运算符>>
,又称为流提取运算符。定义其重载函数的格式为:
istream &operator<<(istream &in, class_name &obj)
{in >> obj.data1;in >> obj.data2;```return in;
}
函数中第一个参数in
是对istream
对象的引用,即in
必须是输入流对象;第二个参数是用户自定义要输入的类对象的引用。
与<<
运算符类似,>>
运算符也不能作为类的成员函数,只能作为类的友元函数或独立函数。
例如:>>
运算符和<<
运算符重载
#include <iostream>
#include <string>
using namespace std;
class Word
{char* word;size_t iNum;//存储字符个数
public:Word(const char* const str = NULL);virtual ~Word(){if (word)delete[]word;}friend ostream& operator <<(ostream& out, const Word& obj);friend istream& operator >>(istream& in, Word& obj);
};Word::Word(const char* const str)
{if (str != NULL){iNum = strlen(str);word = new char[iNum + 1];strcpy_s(word, iNum + 1, str);}
}ostream& operator<<(ostream& out,const Word& obj)
{out << "<" << obj.iNum << ">" << obj.word << endl;return out;
}istream& operator>>(istream& in, Word& obj)
{char str[100];in.getline(str, 100);if (in.gcount() > 0){delete[]obj.word;obj.iNum = strlen(str);obj.word = new char[obj.iNum + 1];strcpy_s(obj.word, obj.iNum + 1, str);}return in;
}int main()
{Word word("hello");cout << word;cin >> word;cout << word;return 0;
}
程序运行结果为:
<5>hello
W
<1>W
相关文章:

C++:输入流/输出流
C流类库简介 C为了克服C语言中的scanf和printf存在的缺点。,使用cin/cout控制输入/输出。 cin:表示标准输入的istream类对象,cin从终端读入数据。cout:表示标准输出的ostream类对象,cout向终端写数据。cerrÿ…...

十、Qt三维图表
一、Data Visualization模块概述 Data Visualization的三维显示功能主要有三种三维图形来实现,三各类的父类都是QAbstract3DGraph,从QWindow继承而来。这三类分别是:三维柱状图Q3DBar三维空间散点Q3DScatter三维曲面Q3DSurface 1、相关类的…...
CMake官方教程中文翻译 Step 6: Adding Support for a Testing Dashboard
鉴于自己破烂的英语,所以把cmake的官方文档用 谷歌翻译 翻译下来方便查看。 英语好的同学建议直接去看cmake官方文档(英文)学习:地址 点这里 或复制:https://cmake.org/cmake/help/latest/guide/tutorial/index.html …...
【leetcode】完全背包总结
本文内容参考了代码随想录,并进行了自己的总结。 完全背包 关键点 ● 每件物品有若干种状态:不选、选 1 件、选 2 件、…、选 n 件 代码 在代码上,只有重量的遍历方向和 01 背包不一样: for(int i 0; i < nums.length; i…...

【Linux】理解系统中一个被打开的文件
文件系统 前言一、C语言文件接口二、系统文件接口三、文件描述符四、struct file 对象五、stdin、stdout、stderr六、文件描述符的分配规则七、重定向1. 重定向的原理2. dup23. 重谈 stderr 八、缓冲区1. 缓冲区基础2. 深入理解缓冲区3. 用户缓冲区和内核缓冲区4. FILE 前言 首…...

k8s kubeadm部署安装详解
目录 kubeadm部署流程简述 环境准备 步骤简述 关闭 防火墙规则、selinux、swap交换 修改主机名 配置节点之间的主机名解析 调整内核参数 所有节点安装docker 安装依赖组件 配置Docker 所有节点安装kubeadm,kubelet和kubectl 定义kubernetes源并指定版本…...

RT-DETR算法优化改进: 下采样系列 | 一种新颖的基于 Haar 小波的下采样HWD,有效涨点系列
💡💡💡本文独家改进:HWD的核心思想是应用Haar小波变换来降低特征图的空间分辨率,同时保留尽可能多的信息,与传统的下采样方法相比,有效降低信息不确定性。 💡💡💡使用方法:代替原始网络的conv,下采样过程中尽可能包括更多信息,从而提升检测精度。 RT-DET…...

CocosCreator3.8源码分析
Cocos Creator架构 Cocos Creator 拥有两套引擎内核,C 内核 和 TypeScript 内核。C 内核用于原生平台,TypeScript 内核用于 Web 和小游戏平台。 在引擎内核之上,是用 TypeScript 编写的引擎框架层,用以统一两套内核的差异…...

(已解决)spingboot 后端发送QQ邮箱验证码
打开QQ邮箱pop3请求服务:(按照QQ邮箱引导操作) 导入依赖(不是maven项目就自己添加jar包): <!-- 邮件发送--><dependency><groupId>org.springframework.boot</groupId><…...

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题
蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V,同时有 n n n 个物品,每…...

2024牛客寒假算法基础集训营1
文章目录 A DFS搜索M牛客老粉才知道的秘密G why外卖E 本题又主要考察了贪心B 关鸡C 按闹分配 今天的牛客,说是都是基础题,头昏昏的,感觉真不会写,只能赛后补题了 A DFS搜索 写的时候刚开始以为还是比较难的,和dfs有关…...

元素的显示与隐藏,精灵图,字体图标,CSSC三角
元素的显示与隐藏 类似网站广告,当我们点击关闭就不见了,但是我们重新刷新页面,会重新出现 本质:让元素在页面中隐藏或者显示出来。 1.display显示隐藏 2.visibility显示隐藏 3.overflow溢出显示隐藏 1.display属性(…...

最新!2024顶级SCI优化!TTAO-CNN-BiGRU-MSA三角拓扑聚合优化、双向GRU融合注意力的多变量回归预测程序!
适用平台:Matlab 2023版及以上 TTOA三角聚合优化算法,将在2024年3月正式发表在中科院1区顶级SCI期刊《Expert Systems with Applications》上。 该算法提出时间极短,目前以及近期内不会有套用这个算法的文献。新年伊始,尽快拿下…...
Flink SQL Client 安装各类 Connector、组件的方法汇总(持续更新中....)
一般来说,在 Flink SQL Client 中使用各种 Connector 只需要该 Connector 及其依赖 Jar 包部署到 ${FLINK_HOME}/lib 下即可。但是对于某些特定的平台,如果 AWS EMR、Cloudera CDP 等产品会有所不同,主要是它们中的某些 Jar 包可能被改写过&a…...

React18-模拟列表数据实现基础表格功能
文章目录 分页功能分页组件有两种接口参数分页类型用户列表参数类型 模拟列表数据分页触发方式实现目录 分页功能 分页组件有两种 table组件自带分页 <TableborderedrowKey"userId"rowSelection{{ type: checkbox }}pagination{{position: [bottomRight],pageSi…...

MySQL查询数据(十)
MySQL查询数据(十) 一、SELECT基本查询 1.1 SELECT语句的功能 SELECT 语句从数据库中返回信息。使用一个 SELECT 语句,可以做下面的事: **列选择:**能够使用 SELECT 语句的列选择功能选择表中的列,这些…...

AJAX-常用请求方法和数据提交
常用请求方法 请求方法:对服务器资源,要执行的操作 axios请求配置 url:请求的URL网址 method:请求的方法,如果是GET可以省略;不用区分大小写 data:提交数据 axios({url:目标资源地址,method…...

2024美国大学生数学建模竞赛美赛B题matlab代码解析
2024美赛B题Searching for Submersibles搜索潜水器 因为一些不可抗力,下面仅展示部分代码(很少部分部分)和部分分析过程,其余代码看文末 Dthxlsread(C:\Users\Lenovo\Desktop\Ionian.xlsx); DpDth(:,3:5); dy0.0042; dx0.0042; …...
【DouYing Desktop】
I) JD 全日制大专及以上学历; 2. 3年以上的IT服务支持相关工作经验 3. 有较强的桌面相关trouble shooting与故障解决能力,能够独立应对各类型桌面问题; 4. 具备基础的网络、系统知识,能够独立解决常见的网络、系统等问题…...

正则表达式与文本处理工具
目录 引言 一、正则表达式基础 (一)字符匹配 1.基本字符 2.特殊字符 3.量词 4.边界匹配 (二)进阶用法 1.组与引用 2.选择 二、命令之-----grep (一)基础用法 (二)高级用…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

2025盘古石杯决赛【手机取证】
前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...