9.6 字符串流

 

9.6 字符串流

C++语言的I/O流库提供了两个类:ostrstreamistrstream。其中,ostrstream 类是从 ostream 类派生来的,用来将不同类型的信息格式化为字符串,并放到一个字符数组中。istrstream 类是从 istream 类派生来的,用来将文本项转换为变量所需要的内部格式。它们都包含在 strstream.h 文件中。

有了上述两个类库,就可以十分方便地实现以下两种转换:

  1. 将一个字符串内的数字转换成整型并存放在基本类型的变量中。
  2. 将一个二进制数转换成字符串并存储在一个字符数组对象中。

9.6.1 ostrstream 类的构造函数

ostrstream 类有两个构造函数,它们的原型分别是:

ostrstream::ostrstream();
ostrstream::ostrstream(char* s, int n, int mode = ios::out);

其中,第一个构造函数是默认构造函数,用来建立存储所插入的数据的数组对象。第二个构造函数带有三个参数,其中 s 是字符指针或字符数组,所插入的字符数据被存放在这里。参数 n 用来指定这个数组最多能存放的字符个数。mode 参数给出流的方式,默认为 ios::out 方式,还可选用 ios::ateios::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

说明:

  1. 使用 ostrstream 类的构造函数创建一个流对象 outl,该流将流向一个字符数组 buf,该数组有80个 char 型元素。通过一个循环 for,将6个字符串 "a=" 和若干整数通过流 outl 插入到 buf 中,最后添加字符串结束符 \0,再输出显示 buf 中的内容。
  2. 将一个 double 型数和一个字符串按其规定的格式通过流 outl 插入到 buf 中,并输出显示。
  3. 使用 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

说明:该程序创建了两个流对象 s1s2,它们使用的是不同的构造函数。这两个流 s1s2 都和字符数组 buf 联系起来。使用 s1s2 时,数据是从 buf 数组中获得的。先从 buf 中获得一个 int 型数,并存放在 i 中;再从 buf 中获得一个 int 型数,并存放在 j 中。s1s2 的使用与 cin 流的使用很相似,其区别仅在于 s1s2 流的数据从 buf 中获取,而 cin 流的数据从键盘输入中获取。

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏驰和徐策

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值