文章目录
1.字符串流
-
字符串流是以内存中的string对象或字符数组(C风格字符串) 为输入输出的对象, 将数据输出到内存中的字符串存储区域, 或者从字符串存储区域读入数据。
-
字符串流的作用是利用输入输出操作方式将各种类型的数据转换成字符序列, 或者相反。
由于计算机物理的或逻辑的设备大多数能处理的数据是字符序列(或字节序列) , 因此字符串流就是程序数据与设备进行数据交换重要的桥梁。 -
字符串流类有(istringstream、 ostringstream、 stringstream) 和(istrstream、 ostrstream、 strstream) 两种。
前一种以C++ string串对象作为字符串, 定义在头文件中;
后一种以字符数组作为字符串(即C风格字符串) , 定义在头文件中。
根据C++标准的定义, strstream是过时的, 未来版本的C++标准可能不再支持strstream, 因此本书使用前一种。 -
使用字符串流类的方法是:
(1)建立字符串流对象, 通过构造函数或成员函数str()与某个字符串关联, 此后对字符串流对象按输入输出形式进行操作。
(2)字符串流类的构造函数和常用成员函数原型如下:
istringstream(openmode which=ios_base::in); //构造字符串输入流对象
//构造字符串输入流对象, 并初始化为str的内容
istringstream(const string & str,openmode which=ios_base::in);
ostringstream(openmode which=ios_base::out); //构造字符串输出流对象
//构造字符串输出流对象, 并初始化为str的内容
ostringstream(const string& str,openmode which=ios_base::out);
//构造字符串输入输出流对象
stringstream(openmode which=ios_base::out|ios_base::in); //构造字符串输入输出
流对象, 并初始化为str的内容
stringstream(const string & str,openmode which=ios_base::out|ios_base::in);
string str(); //返回当前字符串流缓冲区关联的字符串对象的副本
void str(const string & s); //复制字符串s内容到字符串流缓冲区关联的string对象中
- (1)ostringstream 对象用来进行格式化的输出, 可以将各种类型转换为string类型, 只支持 << 操作符,
如:与<<使用,输出到流对象
ostringstream oss;
oss<<1.234; //double型转化为字符串
oss<<" "; //字符串常量转化为字符串
oss<<1234; //int型转化为字符串
oss<<endl;
cout<<oss.str(); //输出“1.234 1234”
oss.str(""); //每次使用前清空
oss<<3.114159; //double型转化为字符串
Str2=oss.str();//返回oss里面的字符串,将返回的值转换成string类型的字符串
cout<<Str2<<endl; //输出“3.14159
- (2) istringstream 对象用于把一个已定义字符串中的以空格隔开的内容提取出来, 只支持 >> 操作符,
如:与>>使用,从流对象提取数据,放到内存
int a;
string str1;
string input="abc 123 def 456 ghi 789";
istringstream iss(input); //通过构造函数对iss进行赋值
while(iss>>str1>>a) cout<<str1<<" "<<a<<endl;
//从iss中,提取一个字符串str1,再提取一个整型数据a,abc给了str1,123给了a
结果:
abc 123
def 456
ghi 789
- (3) stringstream类是istringstream和ostringstream类的综合, 支持<<和>>操作符
int a; string str1;
string input="abc 123 def 456 ghi 789";
stringstream ss;
ss<<input;//将input字符串放到ss
while(ss>>str1>>a) cout<<str1<<" "<<a<<endl;
结果:
abc 123
def 456
ghi 789
- eg:输入一个加减运算的表达式, 输出其值。
#include <iostream>
#include <sstream> //使用字符串流,字符串流的类的定义
using namespace std; //字符串流定义在std命名空间
int main()
{ //字符串流示例
//输入的字符串有+号,-号,数字都可以转换成一个字符串流,
//相反的,还可以把他们转换为字符类型,整型等
string s1, s2; //定义string对象
ostringstream oss; //字符串输出流
istringstream iss; //字符串输入流
char c1='+', c2;
double val, sum=0.0;
cin>>s2; //从键盘上输入字符串 1000+200-30+4+0.4
iss.str(s2); //复制s2内容到字符串输入流
//注意是以空白字符作为分隔符的,在末尾会加一个空格,所以可以将空格作为字符串结束标志
while (c1!=' ') //1000+200-30+4+0.4
{
iss>>val>>c2; //读取一个值和运算符+/-,val=1000,c2=+
if (c1=='+')
sum=sum+val; //由值前面的运算符决定运算
else if (c1=='-')
sum=sum-val;
c1=c2, c2=' '; //保存当前运算符下次用
}
oss<<sum; s1 = oss.str();//运算结果输出到字符串流中,s1是其副本
cout<<s1<<endl; //输出s1到显示器
return 0;
}