std::istringstream的用法

1.概要

std::istringstream 是 C++ 标准库中的一个类,它用于从字符串中提取数据,并将数据转换为不同的数据类型。它通常用于从字符串中解析数据,例如整数、浮点数等。以下是关于 std::istringstream 的详细用法:

  1. 创建 std::istringstream 对象: 首先,你需要创建一个 std::istringstream 对象,将要解析的字符串传递给它。例如:std::istringstream iss("123 45.6");,这将创建一个用于解析字符串 "123 45.6" 的 iss 对象。

  2. 使用输入操作符 >> 提取数据: 你可以使用 >> 操作符从 std::istringstream 对象中提取数据,并将其存储在变量中。例如:int num; iss >> num; 将尝试从 iss 中提取一个整数,并将其存储在 num 中。如果提取成功,num 将包含提取的整数值;如果提取失败,num 不会被改变。

  3. 检查提取是否成功: 你可以检查提取操作的成功与否,通常使用条件语句。例如:if (iss >> num),这将返回 true 如果提取成功,否则返回 false。这允许你根据提取的结果来执行不同的操作。

  4. 多次提取: 你可以多次使用 >> 操作符来从同一个 std::istringstream 对象中提取不同类型的数据。例如,你可以提取整数、浮点数、字符串等。

  5. 清除 std::istringstream: 你可以使用 iss.clear() 来清除 std::istringstream 的错误状态,以便重新使用它。这通常在你想要从同一个 std::istringstream 对象中提取不同类型的数据时非常有用。

2.代码:

下面是一个示例,展示了 std::istringstream 的使用:

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string data = "123 45.6";
    std::istringstream iss(data);
    
    int num;
    double dbl;

    iss >> num; // 提取整数
    iss >> dbl; // 提取浮点数

    if (iss) {
        std::cout << "提取的整数: " << num << std::endl;
        std::cout << "提取的浮点数: " << dbl << std::endl;
    } else {
        std::cout << "提取失败" << std::endl;
    }

    return 0;
}

结果展示

3.函数

参考链接:https://cloud.tencent.com/developer/article/1818951

3.1 rdbuf函数

rdbuf函数原型如下:

//返回一个指向stringbuf对象的指针
__stringbuf_type*
      rdbuf() const
      { return const_cast<__stringbuf_type*>(&_M_stringbuf); }

rdbuf使用案例如下:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
    istringstream istr("istringstream", ios_base::in);
    cout << "string is " << istr.str() << endl;
    cout << "string's len is " << istr.rdbuf()->in_avail() << endl;

    return 0;
}

这里也顺便展示了一下str函数的用法(获取当前对象当前所包含的字符串)
而in_avail是streambuf类里面的另一个函数,用于返回当前缓冲区长度。

编译后执行结果如下:

[root@mylinux ~]# ./a.out 
string is istringstream
string's len is 13
[root@mylinux ~]#

2.2 swap函数

swap函数原型如下:

//用于交换两个istringstream内容
void swap(basic_istringstream& __rhs);

用法如下:

#include <sstream>
#include <iostream>
using namespace std;

int main()
{
    istringstream istr1("lilei");
    istringstream istr2("hanmeimei");
    istr1.swap(istr2);
    cout << "istr1 is " << istr1.str() << endl;
    cout << "istr2 is " << istr2.str() << endl;

    return 0;
}

编译后输出结果如下:

[root@mylinux ~]# ./a.out 
istr1 is hanmeimei
istr2 is lilei
[root@mylinux ~]#

可以看到istr1和istr2两个对象的内容是完全交换了。

posted @ 2023-10-21 21:00  DawnTraveler  阅读(860)  评论(0编辑  收藏  举报