当前课程知识点:C++语言程序设计进阶 > 第十一章 流类库与输入/输出 > 输出流 > 向字符串输出
将字符串作为输出流的目标,可以实现将其他数据类型转换为字符串的功能
用于构造字符串
功能
支持ofstream类的除open、close外的所有操作
str函数可以返回当前已构造的字符串
典型应用
将数值转换为字符串
//11_6.cpp #include <iostream> #include <sstream> #include <string> using namespace std; //函数模板toString可以将各种支持“<<“插入符的类型的对象转换为字符串。 template <class T> inline string toString(const T &v) { ostringstream os; //创建字符串输出流 os << v; //将变量v的值写入字符串流 return os.str(); //返回输出流生成的字符串 } int main() { string str1 = toString(5); cout << str1 << endl; string str2 = toString(1.2); cout << str2 << endl; return 0; } 输出结果: 5 1.2
大家好
欢迎继续学习C++语言程序设计
这一节我们来学习
如何向字符串中输出
大家是不是有个疑问
怎么叫做向字符串输出呢
字符串不也是在程序中
在内存中的一种数据格式吗
是的
我们说的向字符串输出
就是向我们程序内存中的
某个字符串输出
我们可以把内存中的一个字符串
当作输出流的目的地
那这有什么用呢
我们说输出的话
大多数时候
我们是希望把信息
持久化地存到外部存储设备去
那你干吗要放到
内存中的一个字符串中
这是一个很奇妙的功能
我们可以利用这种功能呢
将其他形式的
其他格式的数据
转换成字符串
回想一下
我们以文本方式
向显示器输出数据的时候
是不是把内存中的二进制数据
都转换成文本
转换成字符了呢
是的
现在我们把这个输出的目标对象
指到一个字符串
这个输出过程中
也是按文本输出的
那么就把一些其他类型的数据
它原本的二进制形式
在这个输出过程中
就转成字符了
存到字符串中了
其他格式的信息
就转换成字符串格式了
这是很有用的一个转换方式
现在我们来看
怎么样使用这个字符串输出流
字符串输出流呢
是ofstream类型的流对象
它用于构造一个
从其他类型转换过来的字符串
首先呢
它可以支持ofstream类里面
除了open close以外的所有操作
这个大家也可以理解
因为它不是一个真实的文件
当然它不存在打开文件
和关闭文件的问题
那么其他的操作呢
都可以支持
所以我们可以用其他的操作
比如说插入运算符
向这个字符串中写信息
这个字符串输出流对象呢
它有一个str函数
当你向这个字符串流对象中
插入数据 插入数据 插入数据
你要把输出的内容都输出完了
都装到这个字符串流对象中以后
那么可以用str这个函数
把里面那个字符串给它取出来
取出来的这个字符串
不就相当于将别的类型数据
转成字符串类型的这么一个
转换结果了吗
所以呢
将数值转换成字符串
是这个字符串输出流的
一种典型应用场景
接下来呢
我们就通过一个例题里看看
如何用ofstringstream
将数值转换成字符串
这道题目要求我们
将数值型的数据
能够转换成string类型的对象
我们先看一下主函数
和输出结果
了解一下这个题目
想让这个程序
达到一种什么样的效果
首先我们看到主函数中
两次调用toString
第一次给它的是一个整数作参数
它应该返回一个字符串5
然后输出验证一下
我们看到输出了5
第二次给它一个浮点数1.2
作参数
希望将1.和2合起来
也转换成一个字符串
然后我们接收到
这个返回字符串以后
输出验证一下
可以看到这个验证结果是1.2
现在我们就需要来写
这个toString函数了
看到我们两次调用
这个toString函数
用不同的参数传给它
它都能够正确处理
现在大家是不是想到
重载函数了
其实这道题用了
我们第九章讲的函数模板
用函数模板就可以避免将
这个执行流程完全一样的
算法完全一样的
两个函数体写成重载形式
避免了这样的重载
用函数模板
让编译器在需要的时候
为我们生成重载函数
这个函数模板 toString
它接收的参数呢
是一个T类型的引用
一个抽象的类型 类型参数
然后我们看在这个函数体中
定义了一个
ostringstream的对象os
这是一个字符串输出流
我们可以向这个字符
串输出流里面
插入我们想输出的数据
就像我们向
标准输出流中插入数据
是一样的
所以我们现在用
这个字符串输出流
将参数得到的这个v
这个v用指向的内容
插入到流向字符串的输出流中
那么这样一插入
这个内容到底流向哪儿了呢
在这个os对象里面
其实包含着一个字符串
我们的数据
就在这样的插入过程中
就被自动转换成了字符串
放到了os对象内部的那个容纳
字符串的地方去了
那么怎么将里面的字符串
再取出来呢
它有一个str函数
调用os的str函数
就可以将它内部的
已经转化好的字符串取出来
然后作为返回值返回
这样在主函数中呢
我们就接收到这个返回值
注意
虽然这里我们定义了
一个类型参数t
好象我们在使用tostring的时候
给它什么类型的数据
都应该语法上是可以的呀
其实也还有限制
我们看在这个函数体的内部
执行了插入运算
这就说明
这个引用v所指向的对象
必须是能够进行插入运算的
如果它是一个类的对象的话
我们必须为这个类
重载过对象的插入运算符
当然
对于所有基本数据类型来说
是没有问题的
我们直接去调用就可以了
因为基本数据类型
都可以使用插入运算符来输出
-导学
--导学
-继承的基本概念和语法
-第七章 继承与派生--继承的基本概念和语法习题
-继承方式
-第七章 继承与派生--继承方式
-基类与派生类类型转换
-第七章 继承与派生--基类与派生类类型转换
-派生类的构造和析构
--派生类的构造函数
--派生类的析构函数
--第七章 继承与派生--派生类的构造和析构
-派生类成员的标识与访问
--虚基类
-第七章 继承与派生--派生类成员的标识与访问
-小结
--小结
-综合实例
--第七章综合实例
-实验七
--实验七
-导学
--导学
-第八章 多态性--导学
-运算符重载
--运算符重载的规则
-第八章 多态性--运算符重载
-虚函数
--虚函数
--虚析构函数
--虚表与动态绑定
-第八章 多态性--虚函数
-抽象类
--抽象类
--第八章 多态性--抽象类
-override与final
-第八章 多态性--override与final
-小结
--第八章小结
-综合实例
--第八章综合实例
-实验八
--实验八
- 第八章讲义
-导学
--导学
-模板
--函数模板
--类模板
-第九章 模板与群体数据--模板
-线性群体
--线性群体的概念
-第九章 模板与群体数据--线性群体
-数组
--数组类模板
-链表
--链表类模板
-第九章 模板与群体数据--链表
-栈
--栈类模板
--栈类模板课后习题
--例9-9 栈的应用课后习题
-队列
--队列类模板
-第九章 模板与群体数据--队列
-排序
--排序概述
--插入排序
--选择排序
--交换排序
-第九章 模板与群体数据--排序
-查找
--查找
--查找课后习题
-小结
--小结
-综合实例
--综合实例
-实验九
--实验九
- 第九章讲义
-导学
--导学
-泛型程序设计及STL的结构
--STL简介
-第十章 泛型程序设计与C++标准模板库--泛型程序设计及STL的结构
-迭代器
--迭代器
-第十章 泛型程序设计与C++标准模板库--迭代器
-容器的基本功能与分类
-第十章 泛型程序设计与C++标准模板库--容器的基本功能与分类
-顺序容器
--顺序容器的特征
--第十章 泛型程序设计与C++标准模板库--顺序容器
-关联容器
--集合
--映射
-第十章 泛型程序设计与C++标准模板库--关联容器
-函数对象
--函数对象
--函数适配器
-算法
--算法
-小结
--第十章小结
-综合实例
--综合实例
-实验十
--实验十
- 第十章讲义
-导学
--导学
-I/O流的概念及流类库结构
-第十一章 流类库与输入/输出--I/O流的概念及流类库结构
-输出流
--输出流概述
--向文本文件输出
--向二进制文件输出
--向字符串输出
-第十一章 流类库与输入/输出--输出流
-输入流
--输入流概述
--输入流应用举例
--从字符串输入
-第十一章 流类库与输入/输出--输入流
-输入/输出流
--输入/输出流
-第十一章 流类库与输入/输出--输入/输出流
-小结
--小结
-综合实例
--综合实例
-实验十一
--实验十一
- 第十一章讲义
-导学
--第12章导学
-异常处理的思想与程序实现
-第十二章 异常处理--异常处理的思想与程序实现
-异常处理中的构造与析构
-第十二章 异常处理--异常处理中的构造与析构
-标准程序库异常处理
-第十二章 异常处理--标准程序库异常处理
-小结
--第12章小结
-综合实例
--综合实例
-实验十二
--实验十二
- 第十二章讲义