The Fourth Dimension Space

枯叶北风寒,忽然年以残,念往昔,语默心酸。二十光阴无一物,韶光贱,寐难安; 不畏形影单,道途阻且慢,哪曲折,如渡飞湍。斩浪劈波酬壮志,同把酒,共言欢! -如梦令

istringstream类研究

C++程序把输入和输出看作字符流,输入时,程序从输入流中提取字节,输出时,程序把字节插入到输出流中。对于输入输出流既可以来自标准输入输出设备,也可以来自文件,甚至可以来自String对象,三者分别属于iostream family、fstream family、sstream family。
对于iostream类,就是我们通常所说的标准流,它把程序跟标准I/O连接在一起,输入来自键盘,输出送往监视器。
对于fstream类,它把程序跟文件关联起来,输入来自文件,输出到文件。
对于sstream类,它是提供程序和string对象之间的I/O,可通过ostringstream sout和istringstream sin来声明两个对象,分别对应输出流和输入流,这给编程带来极大的方便,例如可以从文本文件中读取一批数字字符到string对象中,再把string对象作为程序的输入流,既可把从文件中读取来的数字字符单个进行读取,从而进行处理。

以上内容为网上转载,呵呵,原来iostream,fstream还有sstream呈三权分立之势。

#include<iostream>
#include
<fstream>
#include
<sstream>

using namespace std;


int main ()
{
    
char str[1000]="12 34.53 【O(∩_∩)O~(*^__^*)】 1234 12.12345678901234567890 #@$#@$#@$&*@#&#(!@#$";    
    istringstream test(str);
    
//test="12 34.53 345342 34.123456789 【O(∩_∩)O~(*^__^*)】"
    int a;
    
double b;
    
char c[100];
    
while(1)
    
{
        test
>>a;
        test
>>b;
        test
>>c;
    }

return 0;
}



以上程序在vc6.0上运行正常;
值得一提的是,经过我的测试,我发现虽然sstream是纯c++的东西,但是它也可以用char型数组进行初始化;
而且输入的数据默认情况下以空格为分隔符;
输入浮点类型的时候,最多只能取到小数点后15位,第15位会进行四舍五入;
如果你的输入格式和数据流格式不匹配,那么将导致程序完全运行错误,不过我很奇怪c++内部为什么不会报错?
只有一种情况例外
对于一个浮点数 比如说123,456
如果先以整数输入,那么得到123
再以浮点数输入,得到0.456;

小结:感觉istringstream和sscanf是同类型的函数,只不过一个属于传统的c语言而另一个属于高级的c++;
用它可以方便的分离字符串,并且可以在字符串长度未知的情况下进行操作,这是sscanf所无可比拟的。

最后,要特别鸣谢的是张宏课上面的那位同学,多谢你的指点 :-)


posted on 2009-03-23 22:36 abilitytao 阅读(4030) 评论(10)  编辑 收藏 引用

评论

# re: istringstream类研究 2009-03-24 23:46 OwnWaterloo

以上程序在vc6.0上运行正常?

我这里的vc6, 会报很多头文件缺失。
比如iostream 会缺少streambuf stdexcept exception

要自己写这3个文件, 分别再include STREAMBF STDXCEPT XCEPTION

总之, 我这里的vc6的include中的头文件, 名字全是大写,而且都不超过8个字符。
我怀疑我用的是不是vc6 for dos 。。。。  回复  更多评论   

# re: istringstream类研究[未登录] 2009-03-25 00:28 abilitytao

@OwnWaterloo
iostream属于C++标准库   回复  更多评论   

# re: istringstream类研究 2009-03-25 12:31 OwnWaterloo

@abilitytao
我还不知道iostream属于标准库吗?
我只是想问下楼主的vc6的版本?
Microsoft Visual Studio\VC98\Include下的文件是大写还是小写?
有没有8字符限制?
谢谢~

  回复  更多评论   

# re: istringstream类研究 2009-03-25 13:20 OwnWaterloo

@abilitytao
sorry, 刚才语气有点过激。
希望楼主能解答我的问题, 再次感谢~~  回复  更多评论   

# re: istringstream类研究[未登录] 2009-03-25 17:41 abilitytao

@OwnWaterloo
呵呵 那个目录下都是大写的头文件
至于你说的vc for dos,我没有用过 不是很清楚
不过现在vs2008都已经出来了 功能比6.0强大许多 不妨直接用2008吧 网上有下载的

  回复  更多评论   

# re: istringstream类研究 2009-03-25 18:48 OwnWaterloo

@abilitytao
那直接就有 iostream streambuf exception stdexcept 这些文件咯?
它们的文件名都超过8个字符。

我这里没有…… 所以我怀疑是vc6 for dos……

我也有vs2008 …… 不过还有固执的人在使用vc6 …… 所以尽可能的提供支持……  回复  更多评论   

# re: istringstream类研究[未登录] 2009-03-25 23:36 abilitytao

@OwnWaterloo
这个。。。我本来是用vc6.0的 后来发现6.0对运算符重载的支持不太好
而且用6.0调试STL相当麻烦 所以我现在都用2005了 。。。  回复  更多评论   

# re: istringstream类研究 2009-03-26 11:14 Sunshine Alike

学习了。刚刚正遇到一个与string相关的问题 ^_^
不过请教下LZ,C++里把int转为string有什么简便的方法没有,需要用到这些流么  回复  更多评论   

# re: istringstream类研究[未登录] 2009-03-26 16:51 abilitytao

@Sunshine Alike
用ostringstream应该可以 它的作用相当于c里面的sprintf 不过我没有去验证过 你可以自己试试  回复  更多评论   

# re: istringstream类研究 2009-03-28 00:24 Sunshine Alike

@abilitytao
感谢,问题已经解决了。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理