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 (一)基础用法 (二)高级用…...
别再死记硬背Payload了:用BUUCTF Basic靶场案例拆解漏洞利用的本质逻辑
别再死记硬背Payload了:用BUUCTF Basic靶场案例拆解漏洞利用的本质逻辑 在网络安全领域,很多学习者都会陷入一个误区:过度依赖现成的Payload和工具脚本,而忽视了漏洞利用背后的核心逻辑。这种学习方式虽然能快速解决特定题目&…...
探秘书匠策AI:毕业论文写作的“智慧锦囊”大公开!
在学术的广阔天地里,毕业论文如同一座巍峨的山峰,让无数攀登者既敬畏又向往。它不仅是对我们多年学习成果的检验,更是通往学术殿堂的必经之路。然而,面对这座山峰,许多人常常感到无从下手,甚至望而却步。别…...
GLM-OCR辅助Anaconda环境下的数据分析:自动识别图表中的数据标签
GLM-OCR辅助Anaconda环境下的数据分析:自动识别图表中的数据标签 你是不是也遇到过这种情况?从一份PDF报告或者一篇学术论文里,看到一张特别有价值的图表,上面有你想分析的数据趋势。但问题是,这些数据都“锁”在图片…...
保姆级教程:用PyTorch 1.13+全卷积网络搞定MSTAR SAR图像分类(附完整代码)
从零构建PyTorch全卷积网络实现MSTAR SAR图像分类实战指南 当第一次接触MSTAR数据集时,很多开发者会被其特殊的灰度SAR图像特性所困扰。与常规RGB图像不同,SAR图像具有独特的散射特性和成像机制,这给传统计算机视觉方法带来了挑战。本文将带你…...
原生 JS 实现图片预览上传组件:多图上传 + 拖拽上传 + 裁剪预览 + 进度显示(附完整源码)
前言图片上传是前端开发中高频且核心的功能场景,如头像上传、素材管理、表单提交等。本文基于原生 HTMLCSSJavaScript 实现一套企业级图片预览上传组件,包含多图选择、拖拽上传、实时预览、图片裁剪、上传进度显示、文件大小 / 格式校验等功能࿰…...
打造 AI 冒险团:HagiCode 多 Agent 协作配置实战派
MySQL 中的 count 三兄弟:效率大比拼! 一、快速结论(先看结论再看分析) 方式 作用 效率 一句话总结 count(*) 统计所有行数 最高 我是专业的!我为统计而生 count(1) 统计所有行数 同样高效 我是 count(*) 的马甲兄弟…...
STM32与Linux的无缝协作:通过USB CDC/VCP实现高效数据交互
在现代嵌入式机器人系统中,常见的架构是“双核协同”:一个高性能 Linux 主板(如运行 OpenWrt 的 MT7628 )负责网络、音视频和高级应用;一个实时性更强的 MCU(如 STM32F4/F7)负责电机控制、传感器…...
Java实战:通过URL调用自动化触发DolphinScheduler工作流
1. 为什么需要自动化触发工作流? 想象一下你负责一个电商平台的订单处理系统。每当用户下单时,系统需要自动触发一系列操作:库存扣减、支付状态更新、物流信息生成...如果每次都手动点击"运行"按钮,不仅效率低下&#…...
ATCODER ABC C题解炼
这,是一个采用C精灵库编写的程序,它画了一幅漂亮的图形: 复制代码 #include "sprites.h" //包含C精灵库 Sprite turtle; //建立角色叫turtle void draw(int d){for(int i0;i<5;i)turtle.fd(d).left(72); } int main(){ …...
华为与思科路由协议优先级(AD值)对比:选路逻辑与网络设计启示
1. 路由协议优先级:网络世界的交通规则 想象一下你开车去公司,导航给你规划了三条路线:一条是高速但收费,一条是免费但红绿灯多,还有一条是小路但距离最短。你会怎么选?这个选择过程,和路由器选…...
