stringstream本身的复制构造函数是私有的,无法直接用,于是带来了一些复杂的问题
网上,流传着几种办法,如streamA.str(streamB.str()),但这种办法,复制的仅仅是初始化时的string
会在以下这种情况下暴露出问题:
stringstream s1("123aaa");
string s;
int a;
s1>>a;
stringstream s2;
s2.str(s1.str());// <-----就是这句
s1>>s;
cout<<"s1="<<s<<endl;
s2>>s;
cout<<"s2="<<s<<endl;
又有人说,用 s2 << s1.rdbuf(); 代替原来那句,但后果是s1的内容被清掉了。
网上找不到有关的资料,本人也对stream不熟悉。
后来在ning的帮助下,终于了解到还需要把输入输出指针位置进行复制。
经过完善后,整理出复制流的模板函数:
template <class _tStream>
_tStream& CopyStream(_tStream &s, _tStream& a)
{
s.clear(); a.clear(); s.str(a.str());
s.seekg(a.tellg()); s.seekp(a.tellp());
return s;
}
当然,如果你想要方便一些,你可以改成operator=
clear()的调用是必须的,否则如果流在错误状态下是复制不成功的。
当然,这个所谓的复制,仅仅是内容上的复制,状态却被重置了,不能算完美复制,
如果还有这个层次上的需要,那么在复制前还要把要复制的流的状态给保存下来,复制后还原,比较麻烦。 再附另一个流问题,就是因为这个问题才发现前面的情况的:
使用以下代码:
double d=;
char c=;
cin>>d;
cin.clear();
cin>>c;
cout<<d<<'\t'<<c;
运行的时候,输入 -() 然后回车,输出结果是:
(
问题就出现了,既然cin>>d,产生了错误,为什么它不把已经读入的全部字符退回输入流呢?
结果导致cin>>c的时候,得到的却是'('
这个问题就是以前那个四则运算的模板代码的BUG,对于1+-()的式子,'-'号被忽略,而不是报为错误。
晚点,我会把我的新整理的四则运算模板代码发布在本Blog

std::stringstream(2)的更多相关文章

  1. std::stringstream

    使用 std::stringstream,小心 内存! 适时 清空 缓冲 …… 2007年12月14日 星期五 : stringstream是个好东西,网上有不少文章,讨论如何用它实现各种数据类型的转 ...

  2. C2678 二进制“>>”: 没有找到接受“std::stringstream”类型的左操作数的运算符(或没有可接受的转换)

    C2678 二进制“>>”: 没有找到接受“std::stringstream”类型的左操作数的运算符(或没有可接受的转换)

  3. std::stringstream(1)

    在编写应用程序时,我们经常要使用到字符串.C++标准库中的<string>和<sstream>为我们操作字符串提供了很多的方便,例如:对象封装.安全和自动的类型转换.直接拼接. ...

  4. 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)

    string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----- ...

  5. istringstream、ostringstream、stringstream 类简介

    本文系转载,原文链接:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html ,如有侵权,请联系我:534624117@qq.co ...

  6. stringstream的用法【转】

    [本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...

  7. 类型安全且自动管理内存的返回 std::string 的 sprintf 实现

    在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...

  8. [c++][语言语法]stringstream iostream ifstream

    c++中ifstream一次读取整个文件 读取至char*的情况 std::ifstream t; int length; t.open("file.txt"); // open ...

  9. 初识 istringstream、ostringstream、stringstream 运用

    今天编程练习时遇到了istringstream的用法,感觉很实用.后面附题目! C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O 1.头文件  # ...

随机推荐

  1. Java 内存区域和GC机制(转载)

    目录 Java垃圾回收概况 Java内存区域 Java对象的访问方式 Java内存分配机制 Java GC机制 垃圾收集器 Java垃圾回收概况 Java GC(Garbage Collection, ...

  2. JS遍历数组类型元素

    已停供用户不能再次停供,之前没太处理过多维数组的遍历,趁这个机会回顾一下js数组遍历 可以看出rows 获取了两条数据,为二维数组类型 方法 function batchTgWin() { var r ...

  3. android的五大布局(layout)

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...

  4. 前端资源管理工具sourcetree

    https://www.sourcetreeapp.com/

  5. unity3d世界坐标系和本地坐标系

    transform.Translate(Vector3.forware);//向着自己坐标前方 transform.Translate(Vector3.forware,Space.World);//向 ...

  6. PHP:计算文件或数组中单词出现频率

    一:如果是小文件,可以一次性读入到数组中,使用方便的数组计数函数进行词频统计(假设文件中内容都是空格隔开的单词): <?php $str = file_get_contents("/p ...

  7. Atitit.用户权限服务 登录退出功能

    Atitit.用户权限服务 登录退出功能 参数说明 /com.attilax/user/loginOut.jsp?url="+url Utype=mer 作者::  ★(attilax)&g ...

  8. 已安装 SQL Server 2005 Express 工具。若要继续,请删除 SQL Server 2005 Express 工具

    数据库安装sql server2008R2时遇到. 安装sql server 2008 management,提示错误:Sql2005SsmsExpressFacet 检查是否安装了 SQL Serv ...

  9. lantin1

    Latin1是ISO-8859-1的别名,有些环境下写作Latin-1. ISO-8859-1编码是单字节编码,向下兼容ASCII,其编码范围是0x00-0xFF,0x00-0x7F之间完全和ASCI ...

  10. CCNA2.0笔记_IP连接排错

    IPv4 路由排错 ping tracert traceroute telnet show mac address-table show interfaces fastEthernet 0/1 sho ...