字符串流sstream[part3/使用字符串流进行安全的类型转换]
参考:
http://blog.163.com/zhuandi_h/blog/static/180270288201291710222975/
http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html
C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。
在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。
如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream>的类
型转换呢?也许对下面一个简单的例子的回顾能够说服你。假设你想用sprintf()函数将一个变量从int类型转
换到字符串类型。为了正确地完成这个任务,你必须确保证目标缓冲区有足够大空间以容纳转换完的字符
串。此外,还必须使用正确的格式化符。如果使用了不正确的格式化符,会导致非预知的后果。下面是一
个例子:
int n = 1000;
char s[10];
sprintf(s, "%d", n);
到目前为止看起来还不错。但是,对上面代码的一个微小的改变就会使程序崩溃:
int n = 1000;
char s[10];
sprintf(s, "%f", n);
在这种情况下,程序员错误地使用了%f格式化符来替代了%d。因此,s在调用完sprintf()后包含了一个不确
定的字符串。要是能自动推导出正确的类型,那不是更好吗?
由于n和s的类型在编译期就确定了,所以编译器拥有足够的信息来判断需要哪些转换。<sstream>库中声明
的标准类就利用了这一点,自动选择所必需的转换。而且,转换结果保存在stringstream对象的内部缓冲中。
你不必担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。如:
stringstream ss;
string result = "1000";
int n = 0;
ss<<result;
ss>>n; //n等于1000
stringstream通常用来作类型转换
例子一:基本数据类型转string
/*基本数据类型转string*/
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
/*int转string*/
int n = 10;
string str;
stringstream stream; stream << n;
stream >> str;
cout<<str<<endl; //10 stream.clear(); //多次使用stringstream要先clear() /*char*转string*/
char cStr[10] = "China";
stream << cStr;
stream >> str;
cout<<str<<endl; //China system("pause");
return 0;
}
例子二:string转基本数据类型
/*string转基本数据类型*/
#include <fstream>
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
/*string转double*/
double n;
string str = "12.5";
stringstream stream; stream << str;
stream >> n;
cout<<n<<endl; //12.5 stream.clear(); //多次使用stringstream要先clear() /*string转char**/
string str1 = "China";
char cStr[10];
stream << str1;
stream >> cStr;
cout<<cStr<<endl; //输出China stream.clear(); //多次使用stringstream要先clear() int first, second;
stream<< "456";
stream >> first;
cout << first << endl; //456 stream.clear(); //多次使用stringstream要先clear()
stream << true;
stream >> second;
cout << second << endl; //1 system("pause");
return 0;
}
在类型转换中使用模板
你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:
template<typename T>
void to_string(string& result, const T& t)
{
ostringstream oss;
oss<<t;
result = oss.str();
}
这样,你就可以轻松地将多种数值转换成字符串了:
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类型:
#include <iostream>
#include <sstream>
using namespace std; template<typename out_type, typename in_value>
out_type convert(const in_value& t)
{
stringstream ss;
ss<<t;
out_type result;
ss>>result;
return result;
} int main()
{
double d;
string s = "12.56";
d = convert<double, string>(s);
cout<<d<<endl; //12.56
system("pause");
return 0;
}
字符串流sstream[part3/使用字符串流进行安全的类型转换]的更多相关文章
- 【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte
C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.htm ...
- Core Java - 流(Stream) - 字节流和字符流(一)
0. 概述: Java中基于流的I/O构建在4个抽象类之上, 其中2个是字节流,另外2个是字符流. 字节流: InputStream / OutputStream 当操作字节或其它二进制对象时,应当使 ...
- .net学习之集合、foreach原理、Hashtable、Path类、File类、Directory类、文件流FileStream类、压缩流GZipStream、拷贝大文件、序列化和反序列化
1.集合(1)ArrayList内部存储数据的是一个object数组,创建这个类的对象的时候,这个对象里的数组的长度为0(2)调用Add方法加元素的时候,如果第一次增加元神,就会将数组的长度变为4往里 ...
- Java API —— IO流(数据操作流 & 内存操作流 & 打印流 & 标准输入输出流 & 随机访问流 & 合并流 & 序列化流 & Properties & NIO)
1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出 ...
- java IO之 序列流 集合对象Properties 打印流 流对象
序列流 也称为合并流. SequenceInputStream 序列流,对多个流进行合并. SequenceInputStream 表示其他输入流的逻辑串联.它从输入流的有序集合开始,并从 第一个输入 ...
- IO流(6)—转换流
1.处理流之二:转换流 InputStreamReader和OutputStreamWriter 2.当作用的文件就是一个文本文件且使用字节流传输时,需要把它转换成字符流,再在外面加上缓冲流以加速传输 ...
- 一、I/O操作(缓存流,数据流,对象流)
一.缓存流 以介质是硬盘为例子说明,字节流和字符流的缺点: 每次读写的时候,都会访问硬盘,如果读写频率比较高的时候,性能不佳.为了解决问题,采用缓存流. 缓存流在读取的时候,会一次性读较多的数据到缓存 ...
- Java基础:IO流之字节流和字符流
1. 流的概念 流(stream)的概念源于UNIX中管道(pipe)的概念.在UNIX中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备.外部文件等. 一个流,必有源端和目的端 ...
- Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader)
Java基础-IO流对象之字符缓冲流(BufferedWriter与BufferedReader) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.字符缓冲流 字符缓冲流根据流的 ...
随机推荐
- 双人对战的球类游戏IOS源码
双人对战的球类游戏源码,这个是一款双人对战的ios球类游戏源码,游戏的源码也比较详细的,我们在屏幕上下看到各有一个球门,内有一球,两边通过控制轮盘使球进入对方的球门的,其实玩法也很简单的,我们知道体育 ...
- Android开发教程大全介绍
Android是由谷歌在2007年推出的一个开放系统平台,主要针对移动设备市场,目前版本为Android 4.0.Android基于Linux,开发者可以使用Java或C/C++开发Android应用 ...
- XP极限编程
13个核心实战 团队协作(Whole Team) 规划策略(The Planning Game) 软件发布计划(ReleasePlanning) 周期开发计划(IterationPlanning) ...
- C# winform combobox控件中子项加删除按钮(原创)
效果如下图,本人网上搜索资料加上自己的研究终于实现了在combobox子项中加上删除按钮. 一.窗体中的代码: using System; using System.Collections.Gener ...
- 纯js拖拽参考
function myDrag(obj){ obj.onmousedown=function(e){ var e=e||window.event; var diffX=e.clientX-this.o ...
- 【Window】Tor(洋葱头路由)+Privoxy 网络实践(附带Java实例代码)
1.背景 平时我们需要访问onion后缀的网站,需要通过Tor(The Onion Router,洋葱路由器).一般来说安装Tor Broswer就可以满足需要.但是项目我要做的是通过程序来获取oni ...
- 在xml中添加array
在values建立arrays(名字可自定义)的xml: <?xml version="1.0" encoding="utf-8"?> <re ...
- 一个封装好的CSV文件操作C#类代码
using System.Data; using System.IO; namespace DotNet.Utilities { /// <summary> /// CSV文件转换类 // ...
- 最新中国IP段获取办法与转成ROS导入格式
获取中国IP段办法 1.到APNIC获取亚太最新IP分配 http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest 2 ...
- mvc url路由参数的加密和解密
查看某个信息的时候一般会在url上加上该信息在数据库中对应的主键id(而且一般是自增的) url是这样子的 xxxDetail/1 , 虽然对于我们开发人员来说可以这种显式的数据库主键会方便调试过程, ...