stringstream的用法c++11可以用吗,stringstream作用

  stringstream的用法c++11可以用吗,stringstream作用

  [本文来自]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类型转换为string类型。为了正确完成这项任务,您必须确保目标缓冲区有足够的空间来保存转换后的字符串。此外,您必须使用正确的格式化程序。如果使用了不正确的格式化程序,将会导致不可预知的后果。下面是一个例子:

  int n=10000

  chars[10];

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

  目前看来还不错。但是,对上述代码稍作修改就会使程序崩溃:

  int n=10000

  char s[10];

  sprintf(s," %f ",n);//看!的格式化程序错误。

  在这种情况下,程序员错误地使用了%f格式化程序,而不是% d。因此,在调用sprintf()后,s包含一个不确定的字符串。如果能自动推导出正确的类型不是更好吗?

  输入字符串流

  因为N和S的类型是在编译时确定的,所以编译器有足够的信息来确定需要哪些转换。sstream库中声明的标准类利用了这一点,并自动选择必要的转换。此外,转换结果保存在stringstream对象的内部缓冲区中。你不用担心缓冲区溢出,因为这些对象会根据需要自动分配存储空间。

  你的编译器支持sstream吗?

  Sstream库最近才被列入C标准。(不要把sstream和strstream混为一谈,strstream在标准发布前就被删除了。)因此,较老的编译器,如GCC2.95,不支持它。如果你正好在用这样的编译器,想用sstream,那就先升级一下。

  Sstream库定义了三种类型:istringstream、ostringstream和stringstream,分别用于流的输入、输出和输入输出操作。此外,每个类都有相应的宽字符集版本。为简单起见,我主要关注stringstream,因为每个转换都涉及输入和输出操作。

  请注意,sstream使用字符串对象,而不是字符数组。这可以避免缓冲区溢出的危险。此外,传入参数的类型和目标对象是自动派生的,即使使用了不正确的格式化程序,也不会有危险。

  从字符串到整数的转换

  string result=" 10000

  int n=0;

  流结果;

  溪流n;//n等于10000

  重用字符串流对象

  如果打算在多次转换中使用同一个stringstream对象,记得在每次转换前使用clear()方法;

  在多次转换中重用同一个stringstream对象(而不是每次都创建一个新对象)的最大优势在于效率。String对象的构造和析构通常会占用大量CPU时间。

  在类型转换中使用模板

  您可以轻松地定义一个函数模板,将任意类型转换为特定的目标类型。比如需要转换各种数值,比如int,long,double等。转换成字符串。您需要使用带有字符串类型和任意值t作为参数的to_string()函数。函数的作用是:将t转换成一个字符串,并写入结果。使用str()成员函数获取流的内部缓冲区的副本:

  模板类T

  void to_string(字符串结果,const T t)

  {

  ostringstream oss//创建一个流

  OSS t;//将值作为流传递

  result=OSS . str();//获取转换后的字符转折并写入结果

  }

  这样,您可以轻松地将各种数值转换成字符串:

  to_string(s1,10.5);//双精度字符串

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

  to_string(s3,true);//布尔值到字符串

  您可以进一步定义一个通用转换模板,用于任意类型之间的转换。Template convert()包含两个模板参数out_type和in_value,其作用是将in_value转换为out_type:

  模板类输出类型,类输入值

  out_type convert(const in_value t)

  {

  stringstream流;

  流t;//将值传递到流中

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

  流结果;//将值写入结果

  返回结果;

  }

  像这样使用convert():

  双d;

  字符串工资;

  string s=" 12.56

  d=转换double //d等于12.56

  薪金=转换字符串(9000.0);//工资等于“9000”

  结论

  在过去遗留下来的程序代码和纯C程序中,传统的stdio.h形式的改造已经伴随我们很久了。然而,正如本文所述,基于stringstream的转换具有类型安全和无溢出等显著特征,这让我们有足够的理由放弃stdio.h,转而使用sstream。Sstream库还提供了另一个特性——扩展性。您可以通过重载来支持自定义类型之间的转换。

  一些例子:

  Stringstream通常用于数据转换。

  相比C库的转换,更安全,更自动化,更直接。

  示例1:基本数据类型转换示例int到string

  #包含字符串

  #包含流

  #包括iostream

  intmain()

  {

  STD:string streamstream;

  STD:string result;

  inti=1000

  流I;//将int输入流中

  流结果;//从流中提取先前插入的int值

  std:cout结果STD:endl;//打印字符串 1000

  }

  运行结果:

  例2:除了基本类型的转换,还支持char *的转换。

  #包含流

  #包括iostream

  intmain()

  {

  STD:string streamstream;

  char result[8];

  8888流;//将888插入流中

  流结果;//将流中的值提取到结果中

  std:cout结果STD:endl;//屏幕显示 8888

  }

  例3:执行多次转换时,必须调用stringstream的成员函数clear()。

  #包含流

  #包括iostream

  intmain()

  {

  STD:string streamstream;

  intfirst,second

  流“456”;//插入字符串

  先流;//转换为int

  STD:cout first STD:endl;

  stream . clear();//在多次转换之前必须清除流。

  stream true//插入布尔值

  流秒;//提取int

  std:cout第二STD:endl;

  }

  运行clear的结果

  没有跑清的结果。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

相关文章阅读

  • office2010激活密钥大全 怎么永久激活office2010
  • project2010产品密钥免费_project2010激活密钥永久激活码
  • c语言调用退出函数 c语言退出整个程序怎么写
  • c语言中怎么给函数初始化 c语言的初始化语句
  • c语言编写函数计算平均值 c语言求平均函数
  • chatgpt是什么?为什么这么火?
  • ChatGPT为什么注册不了?OpenAI ChatGPT的账号哪里可以注册?
  • OpenAI ChatGPT怎么注册账号?ChatGPT账号注册教程
  • chatgpt什么意思,什么是ChatGPT ?
  • CAD中怎么复制图形标注尺寸不变,CAD中怎么复制图形线性不变
  • cad中怎么创建并使用脚本文件,cad怎么运行脚本
  • cad中快速计算器的功能,cad怎么快速计算
  • cad中快速修改单位的方法有哪些,cad中快速修改单位的方法是
  • cad中心点画椭圆怎么做,cad轴测图怎么画椭圆
  • CAD中常用的快捷键,cad各种快捷键的用法
  • 留言与评论(共有 条评论)
       
    验证码: