9.6 字符串流
C++语言的I/O流库提供了两个类:ostrstream
和 istrstream
。其中,ostrstream
类是从 ostream
类派生来的,用来将不同类型的信息格式化为字符串,并放到一个字符数组中。istrstream
类是从 istream
类派生来的,用来将文本项转换为变量所需要的内部格式。它们都包含在 strstream.h
文件中。
有了上述两个类库,就可以十分方便地实现以下两种转换:
- 将一个字符串内的数字转换成整型并存放在基本类型的变量中。
- 将一个二进制数转换成字符串并存储在一个字符数组对象中。
9.6.1 ostrstream
类的构造函数
ostrstream
类有两个构造函数,它们的原型分别是:
ostrstream::ostrstream();
ostrstream::ostrstream(char* s, int n, int mode = ios::out);
其中,第一个构造函数是默认构造函数,用来建立存储所插入的数据的数组对象。第二个构造函数带有三个参数,其中 s
是字符指针或字符数组,所插入的字符数据被存放在这里。参数 n
用来指定这个数组最多能存放的字符个数。mode
参数给出流的方式,默认为 ios::out
方式,还可选用 ios::ate
和 ios::app
方式。
ostrstream
在进行插入操作时,不在输出流中的末尾自动添加空字符,因此需要在程序中显式地添加这个空字符。
ostrstream
类还提供了如下成员函数:
int ostrstream::pcount();
char* ostrstream::str();
前一个成员函数的功能是返回流中当前已插入的字符的个数。后一个成员函数的功能是返回标识存储串的数组对象的指针值。
使用 ostrstream
类的构造函数所创建的是字符串插入对象,可以向该对象中写入若干不同类型的数据,并以字符文本形式存放在该对象中。
示例 9.28 分析下列程序的输出结果
#include <iostream.h>
#include <strstream.h>
const int N = 80;
void main() {
char buf[N];
ostrstream outl(buf, sizeof(buf));
int a = 50;
for (int i = 0; i < 6; i++, a += 10)
outl << "a=" << a << ";";
outl << '\0';
cout << "Buf: " << buf << endl;
double pi = 3.14159265;
outl.setf(ios::fixed | ios::showpoint);
outl.seekp(0);
outl << "The value of pi=" << pi << '\0';
cout << buf << endl;
char* pstr = outl.str();
cout << pstr << endl;
}
执行该程序输出如下结果:
Buf: a=50;a=60;a=70;a=80;a=90;a=100;
The value of pi=3.14159265
The value of pi=3.14159265
说明:
- 使用
ostrstream
类的构造函数创建一个流对象outl
,该流将流向一个字符数组buf
,该数组有80个char
型元素。通过一个循环for
,将6个字符串 "a=" 和若干整数通过流outl
插入到buf
中,最后添加字符串结束符\0
,再输出显示buf
中的内容。 - 将一个
double
型数和一个字符串按其规定的格式通过流outl
插入到buf
中,并输出显示。 - 使用
str()
函数,返回outl
流的首地址,再通过指针显示出buf
中的内容。
9.6.2 istrstream
类的构造函数
istrstream
类有两个构造函数,它们的原型分别是:
istrstream::istrstream(char* s);
istrstream::istrstream(char* s, int n);
第一个构造函数的参数 s
是一个字符指针或字符数组,使用该串来初始化要创建的流对象。第一个构造函数使用所指定的串的全部内容来构造流对象,第二个构造函数使用串中前 n
个字符来构造串对象。
在实际应用中,istrstream
类对象可以是有名也可以是无名的。例如:
char s[] = "1234";
istrstream(s, 3);
istrstream ss(s, 3);
前一个 istrstream
类对象是无名的;后一个 istrstream
类对象是有名的,其名字是 ss
。用 istrstream
类的构造函数所创建的对象是字符串读取流对象,可以从该对象中提取字符,并按其所规定的内部格式转换为不同类型的数据,存放到指定的变量中。
示例 9.29 分析下列程序的输出结果
#include <iostream.h>
#include <strstream.h>
void main() {
char buf[] = "123 45.67";
int a;
double b;
istrstream ss(buf);
ss >> a >> b;
cout << a + b << endl;
}
执行该程序输出结果如下:
168.67
示例 9.30 分析下列程序的输出结果
#include <iostream.h>
#include <strstream.h>
void main() {
char buf[] = "12345";
int i, j;
istrstream s1(buf);
s1 >> i;
istrstream s2(buf, 3);
s2 >> j;
cout << i + j << endl;
}
执行该程序输出结果如下:
12468
说明:该程序创建了两个流对象 s1
和 s2
,它们使用的是不同的构造函数。这两个流 s1
和 s2
都和字符数组 buf
联系起来。使用 s1
和 s2
时,数据是从 buf
数组中获得的。先从 buf
中获得一个 int
型数,并存放在 i
中;再从 buf
中获得一个 int
型数,并存放在 j
中。s1
和 s2
的使用与 cin
流的使用很相似,其区别仅在于 s1
和 s2
流的数据从 buf
中获取,而 cin
流的数据从键盘输入中获取。