std::stringstream的原理和使用时的注意事项

std::stringstream 是 C++ 标准库中的一个类,位于 <sstream> 头文件中。它提供了一种在内存中操作字符串的方式,类似于文件流的操作。std::stringstream 继承自 std::iostream,因此它具有输入流 (std::istream) 和输出流 (std::ostream) 的功能。

原理

std::stringstream 基于 std::stringbuf 这个缓冲区类。std::stringbuf 维护一个内部的 std::string 对象,所有的读写操作都在这个 std::string 上进行。这使得 std::stringstream 可以像文件流一样使用,但操作的对象是内存中的字符串。

使用方法

以下是 std::stringstream 的一些常见用法:

1. 创建 std::stringstream 对象
#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;
}
2. 写入数据
#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;
    ss << "Hello, ";
    ss << "world!";
    std::cout << ss.str() << std::endl;  // 输出: Hello, world!
}
3. 读取数据
#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss("123 456 789");
    int a, b, c;
    ss >> a >> b >> c;
    std::cout << a << " " << b << " " << c << std::endl;  // 输出: 123 456 789
}
4. 清空和重用 std::stringstream
#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;
    ss << "Hello";
    std::cout << ss.str() << std::endl;  // 输出: Hello
    ss.str("");  // 清空字符串流
    ss.clear();  // 清除状态标志
    ss << "World";
    std::cout << ss.str() << std::endl;  // 输出: World
}
注意
在读取或者写入之前,可以通过ss.str(std::string())或ss.str("")来清空stringstream中的内容。
#include <sstream>
#include <iostream>

int main() {
    std::stringstream ss;
    ss << "Hello";
    std::cout << ss.str() << std::endl;  // 输出: Hello
    ss.str("");  // 清空字符串流
    //ss.clear();  // 清除状态标志
    ss << "World";
    std::cout << ss.str() << std::endl;  // 输出: 	Hello
										 //			 World
}
clear()函数

std::stringstreamclear() 函数用于重置流的状态标志,使得流可以重新用于读取或写入操作。状态标志包括 std::ios::goodbit, std::ios::eofbit, std::ios::failbit, 和 std::ios::badbit,它们表示流的不同状态。

当一个读取或写入操作失败时(例如尝试从空流中读取数据,或者读取的数据与预期类型不符),流会设置相应的状态标志,如 failbitbadbit。一旦设置了这些标志,流就不能再进行进一步的读写操作,除非清除这些标志。

下面是一个使用 std::stringstreamclear() 函数的例子:

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

int main() {
    std::stringstream ss;
    int number;

    // 假设我们有一个不正确的输入,这将导致设置 failbit
    ss.str("abc");
    ss >> number; // 这里会失败,因为 "abc" 不能转换成 int

    // 在进行下一个读取之前,我们需要清除状态标志
    if (ss.fail()) {
        std::cout << "读取发生错误,清除状态标志并继续。\n";
        ss.clear();  // 重置流的状态标志
    }

    // 现在我们可以重新使用 stringstream 了
    ss.str("123"); // 设置新的字符串
    ss >> number;  // 这次转换会成功

    std::cout << "读取的数字是: " << number << std::endl;

    return 0;
}

在这个例子中,我们首先尝试从 stringstream 中读取一个整数,但是由于流中的字符串是 “abc”,所以读取失败并且设置了 failbit。在尝试下一个操作之前,我们调用了 clear() 来重置状态标志。这样我们就可以重新设置流中的字符串并再次尝试读取,这次读取操作成功读取了数字 123。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值