C++:输入流/输出流

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.hqwc.cn/news/449718.html

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

相关文章

Jmeter学习系列之四:测试计划元素介绍

测试计划元素 JMeter包含各种相互关联但为不同目的而设计的元素。在开始使用JMeter之前&#xff0c;最好先了解一下JMeter的一些主要元素。 注意:测试计划包含至少一个线程组。 以下是JMeter的一些主要组件: 测试计划&#xff08;Plan&#xff09;线程组(Thread Group)控制器…

数据结构—基础知识:哈夫曼编码

文章目录 数据结构—基础知识&#xff1a;哈夫曼编码哈夫曼编码的主要思想有关编码的概念哈夫曼编码满足两个性质&#xff1a; 数据结构—基础知识&#xff1a;哈夫曼编码 哈夫曼编码的主要思想 在进行数据压缩时&#xff0c;为了使压缩后的数据文件尽可能短&#xff0c;可采…

车企销售官网搭建流程

引言 近期在整理车企销售官网相关的一些材料时,由于之前也没接触过相关的业务,所以也是一边学习一遍整理,将自己理解官的网搭建流程给梳理出来,供与大家交流讨论。 官网搭建流程 官网搭建流程我分为两大步:网站Demo设计和网站搭建部署,具体流程如下图所示。 流程的具体…

03.PostgreSQL排序和分页

当我们使用SELECT语句查询表中数据的时候,PostgreSQL不确保按照一定的顺序返回结果。如果想要将查询的结果按照某些规则排序显示,需要使用ORDER BY子句。 1. 排序规则 使用ORDER BY 子句排序 ASC: 升序 DESC:降序 ORDER BY 子句在SELECT语句的结尾 1.1 单列排序 是指按…

C++类和对象入门(二)

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C从入门到精通》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 一、类的作用域 类定义了一个新的作用域&#xff0c;类的所有成员都在类的作用域中。在类体外定义成员时&#xff0c;需要…

Red Panda Dev C++ 病毒项目模板

前言 在看这篇文章之前&#xff0c;请查看此文章&#xff01;否则你可能看不懂。 还记得上一讲吗&#xff1f; 没错&#xff0c;我的小脑瓜动了动&#xff0c;就。。。。。 好吧&#xff0c;模板&#xff0c;你又一次成功引起了我的注意 一、创建项目 首先创建一个项目&#x…

机器学习复习(2)——线性回归SGD优化算法

目录 线性回归代码 线性回归理论 SGD算法 手撕线性回归算法 模型初始化 定义模型主体部分 定义线性回归模型训练过程 数据demo准备 模型训练与权重参数 定义线性回归预测函数 定义R2系数计算 可视化展示 预测结果 训练过程 sklearn进行机器学习 线性回归代码…

SqlSever查询某个表的列名称、说明、备注、注释,类型等信息

背景:在工程项目中,有时需要对数据查询进行展示,常规的表格展示虽然能解决大部分问题;但在数据量比较大的情况就如果一次完整的展示信息,势必会造成数据加载中增加耗时,影响数据的展示效果;常规的解决方案都是在数据加载中采取分页的模式,降低数据的加载耗时;但如果要…

AutoCAD .NET 层次结构介绍

AutoCAD .NET API 提供了一种面向对象的编程接口&#xff0c;通过它可以与AutoCAD进行深度集成和自定义功能开发。以下是基于.NET框架下AutoCAD对象层次结构的基本介绍&#xff1a; Autodesk.AutoCAD.ApplicationServices 命名空间 根对象&#xff0c;代表运行中的AutoCAD应用程…

网络空间测绘在安全领域的应用(上)

近年来&#xff0c;网络空间测绘已经跻身为网络通信技术、网络空间安全、地理学等多学科融合的前沿领域。 该领域聚焦于构建网络空间信息的“全息地图”&#xff0c;致力于建立面向全球网络的实时观测、准确采样、映射和预测的强大基础设施。 通过采用网络探测、数据采集、信…

Docker搭建MySQL8主从复制

之前文章我们了解了面试官&#xff1a;说一说Binlog是怎么实现的&#xff0c;这里我们用Docker搭建主从复制环境。 docker安装主从MySQL 这里我们使用MySQL8.0.32版本&#xff1a; 主库配置 master.cnf //基础配置 [client] port3306 socket/var/run/mysqld/mysql.sock [m…

HTMLCSS JavaScript 基础

HTML复杂建立骨架。 CSS复杂装修。 JS负责定义行为和交互。 示例功能&#xff0c;点击按钮&#xff0c;数量增加&#xff0c;图片交互显示。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"…