字符串流 istringstream 和 ostringstream 的用法


1.概述

iostream 标准库支持内存中的输入/输出,只要将流与存储在程序内存中的 string 对象捆绑起来即可。此时,可使用 iostream 输入和输出操作符读写这个 string 对象。

标准库定义了三种类型的字符串流:

  • istringstream,由 istream 派生而来,提供 string 的功能。

  • ostringstream,由 ostream 派生而来,提供 string 的功能。

  • stringstream,由 iostream 派生而来,提供读写 string 的功能。

    要使用上述类,必须包含 sstream 头文件。

与 fstream 类型一样,上述类型由 iostream 类型派生而来,这意味着 iostream 上所有的操作适用于 sstream 中的类型。sstream 类型除了继承的操作外,还各自定义了一个有 string 形参的构造函数,这个构造函数将 string 类型的实参复制给 stringstream 对象。对 stringstream 的读写操作实际上读写的就是该对象中的 string 对象。这些类还定义了名为 str 的成员,用来读取或设置 stringstream 对象所操纵的 string 值。

注意到尽管 fstream 和 sstream 共享相同的基类,但它们没有其他相互关系。特别是,stringstream 对象不使用open 和 close 函数,而 fstream 对象则不允许使用 str。

2.stringstram常用操作

// 创建stringstream对象
stringstream stream;

// 创建以s为副本的stringstream对象
string s = "deardeer.tech";
stringstream stream(s);

// 返回一个string对象,值为当前stringstream对象的内容
stream.str();

// 拷贝s的内容到stream中
stream.str(s);

3.istringstream

istringstream istrm("1 2 3 4 5 6 7 8 9 10");

string word;

while(istrm >> word) {
    cout << word << '|';
}

// 运行结果:1|2|3|4|5|6|7|8|9|10|

2.ostringstream

ostringstream ostrm;

// 将10,9,8,7,..,1写入ostringstream
for(int i = 10; i > 0; i--) {
    ostrm << i << " ";
}

// 输出ostringstream的内容
for(char c : ostrm.str()) {
    cout << c;
}

// 运行结果:10 9 8 7 6 5 4 3 2 1

4.简单应用

a.特殊读入

一般我们可以每次一个单词或每次一行的方式处理输入的程序。第一种程序用 string 输入操作符,而第二种则使用 getline 函数。然而,有些程序需要同时使用这两种方式:有些处理基于每行实现,而其他处理则要操纵每行中每个单词。这时候我们可用 stringstream 对象实现:

string sentence;
// 以行为单位操作
while(getline(cin, sentence)) {
    istringstream istrm(sentence);

    string word;
    while(istrm >> word) {
        // 以单词为单位操作
        cout << word << "#";
    }
}

// 输入:Hello everyone! This is an ostringstream example!
// 输出:Hello#everyone!#This#is#an#ostringstream#example!#

b.格式化读写、转换

int a = 7;
double b = 77.77;
ostringstream ostrm;
// 写入ostringstream
ostrm << "integer: " << a << " float: " << b;
cout << ostrm.str() << endl;

// 此时ostrm内容为:integer: 7 float: 77.77

int c;
double d;
istringstream istrm(ostrm.str());
string ts;
// 从istringstream读出
istrm >> ts >> c >> ts >> d;
cout << c << " " << d << endl;

// 运行结果:
// integer: 7 float: 77.77
// 7 77.77

文章作者: DearDeer
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 DearDeer !
评论
  目录