istringstream类研究

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所无可比拟的。

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


你可能感兴趣的:(istringstream类研究)