ostringstream的使用方法

ostringstream的使用方法ostringstream的使用方法【本文来自】http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alanto

大家好,又见面了,我是你们的朋友全栈君。

ostringstream的使用方法

【本文来自】http://www.builder.com.cn/2003/0304/83250.shtml
http://www.cppblog.com/alantop/archive/2007/07/10/27823.html
使用stringstream对象简化类型转换
C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示如何使用这些库来实现安全和自己主动的类型转换。

为什么要学习

假设你已习惯了<stdio.h>风格的转换,或许你首先会问:为什么要花额外的精力来学习基于<sstream>的类型转换呢?或许对以下一个简单的样例的回想可以说服你。假设你想用sprintf()函数将一个变量从int类型转换到字符串类型。为了正确地完毕这个任务,你必须确保证目标缓冲区有足够大空间以容纳转换完的字符串。此外,还必须使用正确的格式化符。假设使用了不对的格式化符,会导致非预知的后果。以下是一个样例:

int n=10000;

chars[10];

sprintf(s,”%d”,n);// s中的内容为“10000”

到眼下为止看起来还不错。可是,对上面代码的一个微小的改变就会使程序崩溃:

int n=10000;

char s[10];

sprintf(s,”%f”,n);// 看!错误的格式化符

在这样的情况下,程序猿错误地使用了%f格式化符来替代了%d。因此,s在调用完sprintf()后包括了一个不确定的字符串。要是能自己主动推导出正确的类型,那不是更好吗?

进入stringstream

由于ns的类型在编译期就确定了,所以编译器拥有足够的信息来推断须要哪些转换。<sstream>库中声明的标准类就利用了这一点,自己主动选择所必需的转换。并且,转换结果保存在stringstream对象的内部缓冲中。你不必操心缓冲区溢出,由于这些对象会依据须要自己主动分配存储空间。

你的编译器支持<sstream>吗?

<sstream>库是近期才被列入C++标准的。(不要把<sstream>与标准公布前被删掉的<strstream>弄混了。)因此,老一点的编译器,如GCC2.95,并不支持它。假设你恰好正在使用这种编译器而又想使用<sstream>的话,就要先对它进行升级更新。

<sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每一个类都有一个相应的宽字符集版本号。简单起见,我主要以stringstream为中心,由于每一个转换都要涉及到输入和输出操作。

注意,<sstream>使用string对象来取代字符数组。这样能够避免缓冲区溢出的危急。并且,传入參数和目标对象的类型被自己主动推导出来,即使使用了不对的格式化符也没有危急。

string到int的转换

string result=”10000”;
int n=0;
stream<<result;
stream>>n;//n等于10000

反复利用stringstream对象

假设你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;

在多次转换中反复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的优点在于效率。stringstream对象的构造和析构函数一般是很耗费CPU时间的。

在类型转换中使用模板

你能够轻松地定义函数模板来将一个随意的类型转换到特定的目标类型。比如,须要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个随意值t为參数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:

template<class T>

void to_string(string & result,const T& t)

{

ostringstream oss;//创建一个流

oss<<t;//把值传递如流中

result=oss.str();//获取转换后的字符转并将其写入result
}

这样,你就能够轻松地将多种数值转换成字符串了:

to_string(s1,10.5);//double到string

to_string(s2,123);//int到string

to_string(s3,true);//bool到string

能够更进一步定义一个通用的转换模板,用于随意类型之间的转换。函数模板convert()含有两个模板參数out_type和in_value,功能是将in_value值转换成out_type类型:

template<class out_type,class in_value>

out_type convert(const in_value & t)

{

stringstream stream;

stream<<t;//向流中传值

out_type result;//这里存储转换结果

stream>>result;//向result中写入值

return result;

}

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

结论

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们非常长的一段时间。可是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream>。<sstream>库还提供了另外一个特性—可扩展性。你能够通过重载来支持自己定义类型间的转换。

一些实例:

stringstream一般是用来做数据转换的。

相比c库的转换,它更加安全,自己主动和直接。

样例一:基本数据类型转换样例 int转string

#include <string>

#include <sstream>

#include <iostream>

int main()

{

std::stringstream stream;

std::string result;

int i = 1000;

stream << i; //将int输入流

stream >> result; //从stream中抽取前面插入的int值

std::cout << result << std::endl; // print the string “1000”

}

执行结果:

<span role="heading" aria-level="2">ostringstream的使用方法

样例二:除了基本类型的转换,也支持char *的转换。

#include <sstream>

#include <iostream>

int main()

{

std::stringstream stream;

char result[8] ;

stream << 8888; //向stream中插入8888

stream >> result; //抽取stream中的值到result

std::cout << result << std::endl; // 屏幕显示 “8888”

}

<span role="heading" aria-level="2">ostringstream的使用方法

样例三:再进行多次转换的时候,必须调用stringstream的成员函数clear().

#include <sstream>

#include <iostream>

int main()

{

std::stringstream stream;

int first, second;

stream<< “456”; //插入字符串

stream >> first; //转换成int

std::cout << first << std::endl;

stream.clear(); //在进行多次转换前,必须清除stream

stream << true; //插入bool值

stream >> second; //提取出int

std::cout << second << std::endl;

}

执行clear的结果

<span role="heading" aria-level="2">ostringstream的使用方法

没有执行clear的结果

<span role="heading" aria-level="2">ostringstream的使用方法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154308.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Macbook pro 电脑显示连上Wi-Fi但无法上网:解决方案汇总

    Macbook pro 电脑显示连上Wi-Fi但无法上网:解决方案汇总Macbookpro电脑显示连上Wi-Fi但无法上网无网络:解决方案汇总关闭VPN;重启路由器;删改DNS;更改网络位置;重加Wi-Fi服务;还原网络设置;重置SMC;重置NVRAM/PRAM;启用安全模式;管理开机自启软件;添加并使用新用户;备份重装系统;发起Apple服务请求

  • 计算机三级(数据库)备考题目知识点总结

    计算机三级(数据库)备考题目知识点总结计算机三级(数据库)备考题目知识点总结刷题所遇到的知识点总结考后总结刷题所遇到的知识点总结以下都是我在刷题时遇到的常考的知识点,供复习时做参考。1.DBAS需求分析阶段的一项重要工作是分析DBAS应具有的性能指标,主要包括:①数据操作响应时间,或数据访问响应时间;②系统吞吐量,即指系统在单位时间内可以完成的数据库事务或查询的数量;③允许并发访问最大用户数;④每TPS(PriceperTP…

  • 信息搜集 – 二层发现 arping[通俗易懂]

    信息搜集 – 二层发现 arping[通俗易懂]0x00:简介在被动信息搜集工作完成后,需要在进一步的对目标进行主动信息搜集,这一阶段主要搜索的信息包括目标主机是否存活,上面开放了哪些端口,有哪些服务,服务系统是什么,开发服务的版本以及上面支撑系统运行的一些中间件或者其他软件的版本(后续可根据版本号查看是否有公开的漏洞问题),在目标主机发现的过程中,不仅要发现目标是否存活,还要发现其整个网段下的其他设备,同时,这些其他设备也应该像目标一样搜…

  • jsp显示时间的代码_空调代码大全

    jsp显示时间的代码_空调代码大全请参照以下的原代码,注意:下面的JavaScript码可以放置于想要显示时间的任意位置。以下是网页源代码您在本站逗留了varsec=0;varmin=0;varhou=0;flag=0;idt=window.setTimeout(“update();”,1000);functionupdate(){sec++;if(sec==60){sec=0;min+=1;}if(min

  • C#代码对齐_代码中那个向下对齐

    C#代码对齐_代码中那个向下对齐有以下几种办法:1、VS2005用Ctrl+E+D2、VS2008用Ctrl+K+D3、删除最后一个花括号,重新打上4、Ctrl+A(全选)–>Ctrl+X(剪切)–>Ctrl+V(再粘回来)5、选中代码(不含注释行),点取消注释。string与stream互转stringstr=”Thisisstring.”;…

  • mysql数据库主从复制原理_数据库主从一致性验证

    mysql数据库主从复制原理_数据库主从一致性验证文章目录前言一、MySQL主从复制1.支持的复制类型2.主从复制的工作过程是基于日志3.请求方式4.主从复制的原理5.MySQL集群和主从复制分别适合在什么场景下使用6.为什么使用主从复制、读写分离7.用途及条件8.mysql主从复制存在的问题9.MySQL主从复制延迟二、主从复制的形式三、读写分离1.原理2.为什么要读写分离呢?3.什么时候要读写分离?4.主从复制与读写分离5.目前较为常见的MySQL读写分离分为以下两种①基于程序代码内部实现②基于中间代理层实现四、案例实施1.案例环境2.实验思路(解决需

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号