C++:输入流/输出流

news2024/9/28 23:26:31

C++流类库简介

C++为了克服C语言中的scanfprintf存在的缺点。,使用cin/cout控制输入/输出。

  1. cin:表示标准输入的istream类对象,cin从终端读入数据。
  2. cout:表示标准输出的ostream类对象,cout向终端写数据。
  3. cerr:表示标准错误输出(非缓冲方式),导出程序错误信息。
  4. clog:表示标准错误输出(缓冲方式),导出程序错误信息。

为了在程序中使用cin/cout,必须在程序中包含iostream库的相关头文件,格式为:#include <iostream>
iostream类同时从istream(输入流)和ostream(输出流)类派生出来,允许双向输入/输出。输入由重载的>>运算符完成,输出由重载的<<运算符完成,输入/输出格式为:cin>>变量名/cout<<变量名
除了用户端的输入/输出,C++还提供了文件的输入/输出类:

  1. ifstream:从istream派生而来,把文件绑定到程序上输入。
  2. ofstream:从ostream派生而来,把文件绑定到程序上输出。
  3. 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在非负数中显示“+
boolalphatruefalse表示为字符串
scientific以科学记数法形式显示浮点数
fixed以小数形式显示浮点数
unitbuf输出操作后立即刷新所有流
stdio输出操作后刷新stdoutstderr
  1. 设置状态标志
    设置状态标志可使用long ios::setf(long flags)函数,格式为:stream_obj.setf(ios::enum_type);
    说明:其中,stream_obj为被影响的流对象,常用的是cincoutenum_type为上表中列举的值。要想设置多个状态,彼此间用运算符“|”连接(不能连接相反的格式控制符)。
  2. 清除状态标志
    清除状态标志可使用long ios::unsetf(long flags),格式为:stream_obj.unsetf(ios::enum_type);使用方法和ios::setf()相同。
  3. 取状态标志
    取状态标志用flags(),在ios类中重载了两个版本,格式为:long ios::flags();long ios::flags(long flag);前者用于返回当前状态标志字;后者将状态标志字存储在flag内。需要注意的是,与setf()设置状态标志字不同,flags()是取状态标志字的。
  4. 设置域宽
    域宽用于控制输出格式,在ios类中重载了两个函数控制域宽,原型为:int ios::width();或者 int ios::width(int w);第一个函数得到当前的域宽了第二个函数用来设置新的域宽,并返回原来的域宽。需要注意的是,所设置的域宽仅仅对下一个输出的操作有效,当完成一次输出操作后,域宽又恢复为0
  5. 设置填充字符
    填充字符的作用是,当输出值不满域宽时用设定的字符来填充,默认填充的字符为空字符。实际应用中填充字符函数与设置域宽函数配合使用,否则无空可填,毫无意义。ios类提供了两个重载的成员函数来操作填充字符,原型为:char ios::fill();或者char ios::fill(char c);第一个函数返回当前使用的填充字符;第二个函数设置新的填充字符,并返回设置前的填充字符。
  6. 设置显示精度
    类似地,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在非负数中不显示“+
boolalphatruefalse表示为字符串
noboolalphatruefalse表示为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;}

其他输入/输出函数

  1. 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
  2. getline()
    使用get()输入字符串时,经常忘记去掉delimiter所以引入函数getline(),其原型和get()的重载一样:getline(char *str, streamsize size,char delimiter='\n');
    使用getline()get()方便,它除去了delimiter,而不是将其留作下一个字符。
  3. 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

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

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

相关文章

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

水表表盘读数识别新体验,带你进入华为云ModelArts算法套件的世界

前言 数字时代&#xff0c;数字化服务已经发展到各行各业&#xff0c;我们的生活中也随处可见。 数字化服务的便捷了我们的衣食住行的方方面面&#xff0c;除了我们日常化的出行、饮食、购物&#xff0c;其实住方面也已有了很深的发展。 水电燃气这三项和我们生活息息相关的…

YOLO-World: Real-Time Open-Vocabulary Object Detection

文章目录 1. Introduction2. Experiments2.1 Implementation Details2.2 Pre-training2.3 Ablation Experiments2.3.1 预训练数据2.3.2 对RepVL-PAN的消融研究2.3.3 文本编码器 2.4 Fine-tuning YOLO-World2.5 Open-Vocabulary Instance Segmentation2.6 Visualizations Refere…

R语言分析任务:

有需要实验报告的可CSDN 主页个人私信 《大数据统计分析软件&#xff08;R语言&#xff09;》 实 验 报 告 指导教师&#xff1a; 专 业&#xff1a; 班 级&#xff1a; 姓 名&#xff1a; 学 …

Multisim14.0仿真(四十三)LM311应用

一、LM311简介&#xff1a; lm311是一款高灵活性的电压比较器&#xff0c;能工作于5V-30V单个电源或正负15V分离电源。 二、LM311主要特性&#xff1a; ★ 快速响应时间&#xff1a;165 ns。 ★ 选通能力。 ★ 最大输入偏置电流&#xff1a;300nA。 ★ 最大输入偏置电流&#…

8868体育助力意甲尤文图斯俱乐部 帮助球队签订新合同

意甲的尤文图斯俱乐部是8868合作体育球队之一&#xff0c;根据意大利媒体的消息&#xff0c;尤文图斯已经决定和费德里科-基耶萨续约&#xff0c;这名球员已经开始思考他的将来了。 费德里科-基耶萨今年26岁&#xff0c;他和尤文图斯的合约到2025年6月30号就结束了。他知道很多…

大数据分析|设计大数据分析的三个阶段

文献来源&#xff1a;Saggi M K, Jain S. A survey towards an integration of big data analytics to big insights for value-creation[J]. Information Processing & Management, 2018, 54(5): 758-790. 下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1…

flask基于django大数据的证券股票分析系统python可视化大屏

证券分析系统采用B/S架构&#xff0c;数据库是MySQL。网站的搭建与开发采用了先进的Python进行编写&#xff0c;使用了Django框架。该系统从两个对象&#xff1a;由管理员和用户来对系统进行设计构建。主要功能包括&#xff1a;个人信息修改&#xff0c;对股票信息、股票买入、…

[Linux 进程(六)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制&#xff0c;讲之前我们先把写时拷贝理清&#xff0c;然后再开始讲进程控制。…

从源代码看Chrome 版本号

一直以来都是用Chrome 浏览器&#xff0c;但是看到Chrome 点分4 组数据的表达方式&#xff0c;总是感觉怪怪的&#xff0c;遂深入源代码了解她的版本号具体表示的内容 chrome 浏览器中显示的版本号 源代码中的版本号标识 版本号文件位于 chrome/VERSION &#xff0c; 看到源代…

Docker上安装配置tomcat

目录 1. 拉取镜像 2. 创建运行镜像 3. 查看是否创建成功 ps&#xff1a;如果出现404错误 tomcat目录结构 1. 拉取镜像 这里使用 tomcat:8.5.40 版本作为安装 docker pull tomcat:8.5.40 2. 创建运行镜像 docker run -d --name tomcat -p 8080:8080 \--privilegedtrue …

2024最新版Sublime Text 4安装使用指南

2024最新版Sublime Text 4安装使用指南 Installation and Usage Guide to the Latest Sublime Text 4 in 2024 By JacksonML 0. Sublime Text是什么&#xff1f; Sublime Text 由自定义组件构建&#xff0c;支持Python, Java, C/C等多种编程语言&#xff0c;并为用户提供无与…

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

flutter如何实现省市区选择器

前言 当我们需要用户填写地址时&#xff0c;稳妥的做法是让用户通过“滚轮”来滑动选择省份&#xff0c;市&#xff0c;区&#xff0c;此文采用flutter的第三方库来实现这一功能&#xff0c;比调用高德地图api简单一些。 流程 选择库 这里我选择了一个最近更新且支持中国的…

本体匹配方法概述

目录 前言1 基于术语匹配的方法1.1 字符串匹配1.2 语言方法 2 基于虚拟文档的方法3 基于结构的匹配方法3.1 结构信息利用3.2 Anchor-prompt方法 4 大型本体匹配4.1 本体划分4.2 匹配分块4.3 实体间映射 结语 前言 本文将深入探讨本体匹配的不同方法&#xff0c;从基于术语匹配…

Python||五城P.M.2.5数据分析与可视化_使用华夫图分析各个城市的情况(上)

目录 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成都市&#xff0c;使用华夫图分析各个城市的情况 1.北京市的空气质量 2.广州市的空气质量 【上海市和成都市空气质量情况详见下期】 五城P.M.2.5数据分析与可视化——北京市、上海市、广州市、沈阳市、成…

108.乐理基础-五线谱-五线谱的拍号、音符与写法

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;十五度记号-CSDN博客 上一个内容联系的答案&#xff1a; 调号、拍号、速度的性质与内涵跟简谱里一样&#xff0c;所以这里只会写它们在五线谱里造型上有什么改变&#xff0c;该怎样去识别。 拍号&#xff1a;五线…

深度学习入门笔记(七)卷积神经网络CNN

我们先来总结一下人类识别物体的方法: 定位。这一步对于人眼来说是一个很自然的过程,因为当你去识别图标的时候,你就已经把你的目光放在了图标上。虽然这个行为不是很难,但是很重要。看线条。有没有文字,形状是方的圆的,还是长的短的等等。看细节。纹理、颜色、方向等。卷…

聚观早报 | 360 AI搜索App上线;岚图汽车与京东达成合作

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 1月30日消息 360 AI搜索App上线 岚图汽车与京东达成合作 三星电子在硅谷新设实验室 小米平板7系列参数曝光 Spa…

【文本到上下文 #8】NLP中的变形金刚:解码游戏规则改变者

一、说明 欢迎来到我们对不断发展的自然语言处理 &#xff08;NLP&#xff09; 领域的探索的第 8 章。在本期中&#xff0c;我们将重点介绍一项重塑 NLP 格局的突破性创新&#xff1a;Transformers。在我们之前对 seq2seq 模型、编码器-解码器框架和注意力机制的讨论之后&#…