网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>JAVA>>新手入门>>基础入门>查看文档  
  to_stream函数让解析字符串更简单     
  文章作者:未知  文章来源:水木森林  
  查看:152次  录入:管理员--2007-11-17  
 
  开发人员常常需要解析字符串。你可以使用低层的c函数strtok(尽管不推荐这样做),或者你可以自己写一个字符串分割器(string tokenizer)或者找一个现成的实现。

不管怎样,你通常会需要作一些基本的解析,其中分隔字符(token)用的是空格字符。对于这个基本需求,你可以从你的字符串创建一个stringstream,并用运算符“〉〉”来解析出每个词(然后把它视作你希望的任何意义)。

下面是一个例子:

#include 〈string〉
#include 〈iostream〉
#include 〈sstream〉

int main(int argc, char* argv[])
{
// 输入字符串
std::string strinput = "john doe 355223";
// 创建一个stringstream,逐个单词地解析它
std::stringstream streamin( strinput);

std::string strfirstname;
std::string strlastname;
int nid;
streamin 〉〉 strfirstname 〉〉 strlastname 〉〉 nid;

// 显示我们解析出来的信息
std::cout 〈〈 "first name: " 〈〈 strfirstname 〈〈 std::endl
〈〈 "last name: " 〈〈 strlastname 〈〈 std::endl
〈〈 "employee id: " 〈〈 nid 〈〈 std::endl;
return 0;
}

你可以自动化上面的过程,通过一个函数,只要给它一个字符串作为参数,就返回一个stringstream供你稍后解析
to_stream函数的代码并不像你想象的那么直截了当。这是因为我们要返回一个临时值,而这个值稍后会被视作一个常量(constant)。你不能写入到一个常量stringstream。因此,我们需要给stringstream加一层包装。

#include 〈iostream〉
#include 〈string〉
#include 〈sstream〉

namespace private
{
template〈 class char_type, class char_traits〉
struct stream_holder
{
typedef stream_holder〈 char_type, char_traits〉 this_class;
typedef std::basic_istringstream〈 char_type, char_traits〉 stream_type;
typedef std::basic_string〈 char_type, char_traits〉 string_type;
stream_holder( const string_type & value)
: m_stream( value)
{}
stream_holder( const this_class & source)
: m_stream( source.m_stream.str() )
{}

// 允许将这个stream传给接受stream作为参数的函数
operator stream_type & () const
{ return m_stream; }
private:
mutable stream_type m_stream;
};

template〈 class char_type, class char_traits, class value_type〉
inline typename stream_holder〈 char_type, char_traits〉::stream_type & operator 〉〉 (const stream_holder〈 char_type, char_traits〉 & streamin, value_type & value)
{
typedef typename stream_holder〈 char_type, char_traits〉::stream_type stream_type;
stream_type & underlyingstream = streamin;
underlyingstream 〉〉 value;
return underlyingstream;
}

} // namespace private

template〈 class char_type, class char_traits〉
private::stream_holder〈 char_type, char_traits〉 to_stream(
const std::basic_string〈 char_type, char_traits〉 & str)
{
return str;
}

template〈 class char_type〉
private::stream_holder〈 char_type, std::char_traits〈 char_type〉 〉 to_stream( const char_type * str)
{
return ( std::basic_string〈 char_type〉)str;
}

现在,前面的例子变成这个样子:

int main(int argc, char* argv[])
{
std::string strfirstname;
std::string strlastname;
int nid;
to_stream( "john doe 355223") 〉〉 strfirstname 〉〉 strlastname 〉〉 nid;

// 显示我们解析出来的信息
std::cout 〈〈 "first name: " 〈〈 strfirstname 〈〈 std::endl
〈〈 "last name: " 〈〈 strlastname 〈〈 std::endl
〈〈 "employee id: " 〈〈 nid 〈〈 std::endl;
return 0;
}
 
 
上一篇: the xlet application model    下一篇: tsp递归程序的优化
  相关文档
j2se综合--讨论vector遍历的通用实现 12-28
用.net创建windowsservice的总结 11-17
a java advanced imaging program 11-17
高级:使用spring更好地处理struts动作 01-15
x3d实战基础讲座之一 11-16
java面试陷阱第二波 11-17
谈模式(singleton pattern)的变形 11-17
jrc-src0.4.00源代码发布版(java客户端框架) 11-17
java设计模式之 proxy(代理) 11-17
java教程 11-17
一个象棋手机游戏的源代码 11-17
scjp学习指南 11-17
java编程实现列表框元素动态变化 11-16
java基础:对象的序列化和反序列化实践 11-16
x3d实战基础讲座之八 11-16
探讨java与ruby语言迁移时的安全性问题 11-19
商业周刊:开发工具大战java进退维谷 11-16
java源码分析--深入探讨iterator模式 11-16
用 validator 简化 struts 的开发过程 11-17
编写高级jscript应用代码 11-17
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
技术电话:13616026886
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息