std::stringstream(2)
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)的更多相关文章
- std::stringstream
使用 std::stringstream,小心 内存! 适时 清空 缓冲 …… 2007年12月14日 星期五 : stringstream是个好东西,网上有不少文章,讨论如何用它实现各种数据类型的转 ...
- C2678 二进制“>>”: 没有找到接受“std::stringstream”类型的左操作数的运算符(或没有可接受的转换)
C2678 二进制“>>”: 没有找到接受“std::stringstream”类型的左操作数的运算符(或没有可接受的转换)
- std::stringstream(1)
在编写应用程序时,我们经常要使用到字符串.C++标准库中的<string>和<sstream>为我们操作字符串提供了很多的方便,例如:对象封装.安全和自动的类型转换.直接拼接. ...
- 实战c++中的string系列--std:vector 和std:string相互转换(vector to stringstream)
string.vector 互转 string 转 vector vector vcBuf;string stBuf("Hello DaMao!!!");----- ...
- istringstream、ostringstream、stringstream 类简介
本文系转载,原文链接:http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html ,如有侵权,请联系我:534624117@qq.co ...
- stringstream的用法【转】
[本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/ ...
- 类型安全且自动管理内存的返回 std::string 的 sprintf 实现
在这篇博文里,我提到了一个例子,说的是使用C++实现类型安全的printf.这个例子很惊艳,但是在我写程序的时候,并非那么"迫切"地需要它出现在我的工具箱中,因为它并不比普通的pr ...
- [c++][语言语法]stringstream iostream ifstream
c++中ifstream一次读取整个文件 读取至char*的情况 std::ifstream t; int length; t.open("file.txt"); // open ...
- 初识 istringstream、ostringstream、stringstream 运用
今天编程练习时遇到了istringstream的用法,感觉很实用.后面附题目! C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O 1.头文件 # ...
随机推荐
- MAC-Zsh安装与使用——终极Shell
前言:Zsh可配置性强,用户可以自定义配置,个性化强.Zsh tab补全更强大,该功能可以让我们节约很多时间.Zsh 还有代码高亮功能,使得代码更好看了,显得逼格更高.Zsh 还有很多强大的功能,这里 ...
- gitlab8.0 一键安装 经过自己测试 发送邮件部分最难搞 国内没有说明白的
邮件发送部分,弄了一天终于弄好啦,FQ过去查的资料,奶奶的无语 Gitlab搭建步骤 一:操作系统环境 CentOS: 6.5 –x86-64 二:安装方式 一种是自定义安装,一种是一键安装 三:自定 ...
- poj_2773
题目的愿意非常easy.给你一个n,求在升序排列的情况下,第k个与之相互素的数. 解法:首先我们要知道gcd(b×t+a,b)=gcd(a.b),那么接下来就非常easy了.全部与之互素的数都是以ph ...
- spring boot下WebSocket消息推送(转)
原文地址:https://www.cnblogs.com/betterboyz/p/8669879.html WebSocket协议 WebSocket是一种在单个TCP连接上进行全双工通讯的协议.W ...
- Codeforces Round #265 (Div. 2) B. Inbox (100500)
Over time, Alexey's mail box got littered with too many letters. Some of them are read, while others ...
- Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net
Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...
- linux下Oracle数据库实例开机自启动设置
linux下数据库实例开机自启动设置 1.改动/oratab [root@org54 ~]# vi/etc/oratab --把N改为Y,例如以下提示 # This file is used ...
- python操作sqlserver
# coding=gbk import sys import pymssql #尝试数据库连接 try: conn = pymssql.connect(host="192.168 ...
- 分页技术框架(Pager-taglib)学习二(SSH数据库分页)
一.Pager-taglib数据库分页前提 Pager-taglib分页标签也可以实现数据库分页,与页面分页不同的是需要给后台传两个参数,一个是pageNo(当前页数)或pageOffset(偏 ...
- .htaccess中的apache rewrite规则写法详解
.htaccess中的apache rewrite写法: 1 RewriteEngine On 2 RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ 3 Rewr ...