时间:2021-02-18 11:21:03 | 栏目:C代码 | 点击:次
要实现这个目标,非stringstream类莫属。
这个类在头文件中定义, < sstream>库定义了三种类:istringstream、ostringstream和stringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。
简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。
示例1示范怎样使用一个stringstream对象进行从 string到int类型的转换 注意,使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。
示例1:
string result="10000";
int n = 0;
stream << result; stream >> n;//n等于10000
int n = 12345;
stream << n;
result =stream.str();// result等于"12345"
示例2:
for (int i= 1; i < 10; ++i)
{
strsql << "insert into test_tab values(";
strsql << i << ","<< (i+10) << ");";
std::string str = strsql.str();// 得到string
res = sqlite3_exec(pDB,str.c_str(),0,0, &errMsg);
std::cout << strsql.str() << std::endl; strsql.clear();
strsql.str("");
}
例如,需要将各种数字值,如int、long、double等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。
to_string()函数将t转换为字符串并写入result中。
使用str()成员函数来获取流内部缓冲的一份拷贝:
示例3:
{ ostringstream oss;//创建一个流 oss< out_type convert(const in_value & t)
{ stringstream stream; stream<>result;//向result中写入值 return result; }
结论:在过去留下来的程序代码和纯粹的C程序中,传统的形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于 stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃而使用< sstream>。
当然现在还有一个更好的选择,那就是使用boost库中的lexical_cast,它是类型安全的转换。
如下例:
using namespace std;
using namespace boost;
int main(void)
try
{
//以下是内置类型向string转换的解决方案
//lexical_cast优势明显
int ival;
char cval;
ostringstream out_string;
string str0;
string str1;
ival = 100;
cval = 'w';
out_string << ival << " " << cval;
str0 = out_string.str();
str1 = lexical_cast(ival) + lexical_cast(cval);
cout << str0 << endl; cout << str1 << endl;
//以下是string向内置类型转换的解决方案
//几乎和stringstrem相比,lexical_cast就是类型安全的,
int itmpe;
char ctmpe;
str0 = "100k";
str1 = "100h";
istringstream in_string( str0 );
in_string >> itmpe >> ctmpe;
cout << itmpe << " " << ctmpe << endl;
itmpe = lexical_cast(str1);
ctmpe = lexical_cast(str1);
system( "PAUSE" );
return 0;
} catch(bad_lexical_cast e)
{ cout << e.what() << endl; cin.get(); }