sstream的用法详解
sstream的用法详解

C++ 中的 <sstream> 全解析:istringstream、ostringstream 与 stringstream 的用法详解

C++ 提供的 <sstream> 头文件中包含了三个非常有用的类:istringstreamostringstreamstringstream。它们提供了类似 cin / cout 的接口,专门用于字符串的流式读写,是处理字符串与各种类型之间转换的强大工具。


📌 基本介绍

类名用途读写能力类似于
istringstream从字符串中读取内容输入流(只读)std::cin
ostringstream向字符串中写入内容输出流(只写)std::cout
stringstream读写字符串内容输入 + 输出iostream

📘 1. std::istringstream —— 从字符串中提取数据

常用 API

方法描述
istringstream(str)用字符串初始化流
iss.str()获取当前的字符串内容
iss.str("new str")重新设置流的字符串
iss >> var从流中提取变量(空格分隔)
std::getline(iss, s, delim)读取直到分隔符(默认换行)

示例:将字符串中的数字提取为整数

 1#include <sstream>
 2#include <iostream>
 3
 4void parse_numbers(const std::string& input) {
 5    std::istringstream iss(input);
 6    int x;
 7    while (iss >> x) {
 8        std::cout << "Read: " << x << "\n";
 9    }
10}
11
12// 调用:parse_numbers("10 20 30");

📗 2. std::ostringstream —— 构造字符串输出

常用 API

方法描述
ostringstream()创建空流
oss.str()获取流中生成的字符串
oss.str("...")重新设置流中的字符串(无效化之前内容)
oss << data向流中写入数据
oss.clear()清除错误状态(用于重复使用)

示例:构建调试字符串

1#include <sstream>
2#include <string>
3#include <iostream>
4
5std::string format_person(const std::string& name, int age) {
6    std::ostringstream oss;
7    oss << "Name: " << name << ", Age: " << age;
8    return oss.str();
9}

📙 3. std::stringstream —— 可读可写的字符串流

常用 API(结合 istringstreamostringstream

方法描述
stringstream()创建空流
ss.str()获取或设置字符串
ss << val写入数据
ss >> val读取数据
std::getline(ss, s, delim)分隔符读取
ss.clear()清除状态位(用于重用流)

示例:构造字符串并立即解析内容

 1#include <sstream>
 2#include <string>
 3#include <iostream>
 4
 5void demo_stringstream() {
 6    std::stringstream ss;
 7    ss << "42 hello 3.14";
 8
 9    int i;
10    std::string word;
11    double d;
12
13    ss >> i >> word >> d;
14    std::cout << i << " " << word << " " << d << "\n";
15}

🎯 高级应用:自定义分隔符解析 CSV

 1#include <sstream>
 2#include <vector>
 3#include <string>
 4#include <iostream>
 5
 6std::vector<std::string> split_csv(const std::string& line) {
 7    std::vector<std::string> result;
 8    std::stringstream ss(line);
 9    std::string token;
10    while (std::getline(ss, token, ',')) {
11        result.push_back(token);
12    }
13    return result;
14}

❗ 注意事项与技巧

小技巧 / 陷阱说明
流状态清空需要调用 clear()否则可能导致下一次读写失败
流内容重置可用 str("")清除原内容
字符串中的多个空格默认被忽略提取时以空白符分隔
可以重载 << / >> 运算符实现自定义类型的流操作非常适合序列化与反序列化

🔚 总结

sstream 是一个在 C++ 开发中非常实用却常被忽视的工具,它弥补了 C++ 在字符串处理上的一些短板,尤其适合:

  • 字符串与数字之间的转换

  • 字符串格式化输出

  • 字符串分割 / 解析

  • 文本协议 / 日志格式处理

掌握 stringstream,可以让你写出更加优雅、简洁、可维护的字符串处理代码。


最后修改于 2025-07-03 17:26