istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。
#include<iostream>
#include<sstream>
using namespace std;
int main()
{
string str, line;
while(getline(cin, line))
{
istringstream stream(line);
while(stream>>str)
cout<<str.c_str()<<endl;
}
return 0;
}
测试:
input:
abc df e efgeg ffg
ouput:
abc
df
e
efgeg
ffg
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;
}
#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所无可比拟的。
最后,要特别鸣谢的是张宏课上面的那位同学,多谢你的指点 :-)