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=0;
char c=0;
cin>>d;
cin.clear();
cin>>c;
cout<<d<<‘\t‘<<c;
运行的时候,输入 -() 然后回车,输出结果是:
0 (
问题就出现了,既然cin>>d,产生了错误,为什么它不把已经读入的全部字符退回输入流呢?
结果导致cin>>c的时候,得到的却是‘(‘
这个问题就是以前那个四则运算的模板代码的BUG,对于1+-(2)的式子,‘-‘号被忽略,而不是报为错误。
晚点,我会把我的新整理的四则运算模板代码发布在本Blog

std::stringstream(2)

时间: 2024-11-02 22:53:17

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

std::stringstream(1)

在编写应用程序时,我们经常要使用到字符串.C++标准库中的<string>和<sstream>为我们操作字符串提供了很多的方便,例如:对象封装.安全和自动的类型转换.直接拼接.不必担心越界等等.但今天我们并不想长篇累牍得去介绍这几个标准库提供的功能,而是分享一下stringstream.str()的一个有趣的现象.我们先来看一个例子: 1 #include <string> 2 #include <sstream> 3 #include <iostre

实战c++中的string系列--std:vector&lt;char&gt; 和std:string相互转换(vector to stringstream)

有时候也会遇到std:vector与转std:string 相互转换的情况. 首先看一下vector<char>如何转string: std::vector<char> *data = response->getResponseData(); std::string res; //方法一 for (int i = 0;i<data->size();++i) { res+=(*data)[i]; } res+='\0'; std:cout << res;

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

string.vector 互转 string 转 vector vector  vcBuf;string        stBuf("Hello DaMao!!!");----------------------------------------------vcBuf.resize(stBuf.size());vcBuf.assign(stBuf.begin(), stBuf.end()); vector 转 string  stBuf.clear();stBuf.assign(v

初识 istringstream、ostringstream、stringstream 运用

今天编程练习时遇到了istringstream的用法,感觉很实用.后面附题目! C++的输入输出分为三种: (1)基于控制台的I/O (2)基于文件的I/O (3)基于字符串的I/O 1.头文件  #include <sstream> 2.作用 istringstream类用于执行C++风格的字符串流的输入操作. ostringstream类用于执行C++风格的字符串流的输出操作. strstream类同时可以支持C++风格的串流的输入输出操作. 3.具体分析 istringstream类 描

转:stringstream的用法

[本文来自]http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/10/27823.html使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换. 为什么要学习 如果你已习惯了&l

stringstream的用法-类型之间的转换

本文来自: http://www.builder.com.cn/2003/0304/83250.shtmlhttp://www.cppblog.com/alantop/archive/2007/07/10/27823.html 使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性.在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换. 为什么要学习 如果你已习惯了&

秋季面试准备(1)——atoi的实现以及C++库函数stringstream

记得去年9月28日赶到交大去听july的算法面试讲座,他给我们出的第一个题目就是用代码实现atoi,限时10mins.由于当时很久没接触编程,当堂没写出来.记得当时讲解的时候就是要我们特别注意边界条件.写程序就像砌围墙,得先把边界条件弄好.转眼一年过去了,再过几个月就要出去hunting job了,现在回顾下atoi这个函数. 1 //判断字符是否是空格等特殊转义字符,这些输入没有显式输入 2 isspace(int x) 3 { 4 if(x==' '||x=='/t'||x=='/n'||x

C++ stringstream介绍,使用方法与例子

From: http://www.usidcbbs.com/read-htm-tid-1898.html C++引入了ostringstream.istringstream.stringstream这三个类,要使用他们创建对象就必须包含sstream.h头文件. istringstream类用于执行C++风格的串流的输入操作. ostringstream类用于执行C风格的串流的输出操作. strstream类同时可以支持C风格的串流的输入输出操作. istringstream类是从istream

关于stringstream的学习

<sstream>库定义了三种类:istringstream.ostringstream和stringstream,分别用来进行流的输入.输出和输入输出操作.另外,每个类都有一个对应的宽字符集版本.简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作. 注意,<sstream>使用string对象来代替字符数组.这样可以避免缓冲区溢出的危险.而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险. 1.首先我们写一个模板