C++之std::stringstream详解

C++之std::stringstream详解

目录

1.简介

2.核心功能与示例

2.1.类型转换(最常用)

2.2.字符串拼接

2.3.字符串分割

3.进阶用法

4.注意事项

5.总结


1.简介

        std::stringstream 是 C++ 标准库 <sstream> 头文件提供的字符串流类,核心作用是在字符串基本数据类型之间做转换,以及灵活地拼接 / 分割字符串。它属于内存流(而非文件流),所有操作都在内存中完成,效率高且使用灵活。

        头文件:

#include <sstream> // 核心:字符串流 #include <iostream> // 控制台输出(辅助) #include <string> // 处理字符串(辅助) using namespace std; // 简化代码,实际项目可按需省略

<sstream> 提供三个核心类(均继承自 std::iostream):

类名 核心功能 类比 std::istringstream 只读字符串流(输入流) 类似 ifstream std::ostringstream 只写字符串流(输出流) 类似 ofstream std::stringstream 读写字符串流(双向流) 类似 fstream

2.核心功能与示例

2.1.类型转换(最常用)

stringstream 是 C++ 中灵活的类型转换工具,可实现任意基本类型(int/float/double 等)与字符串的互转,比 atoi/atof 或 C++11 的 std::to_string 更通用(支持多类型混合转换)。

1.数字 → 字符串

// 单个数字转字符串 int num = 123; ostringstream oss; oss << num; // 像输出到控制台一样写入字符串流 string str_num = oss.str(); // 获取流中的字符串 cout << "int转string:" << str_num << endl; // 输出:123 // 多类型混合转字符串 double pi = 3.14159; bool flag = true; ostringstream oss2; oss2 << "π = " << pi << ",是否有效:" << boolalpha << flag; string str_mix = oss2.str(); cout << str_mix << endl; // 输出:π = 3.14159,是否有效:true

2.字符串 → 数字

// 字符串转单个数字 string str = "456.789"; istringstream iss(str); double d; iss >> d; // 像从控制台读取一样解析字符串 if (iss.fail()) { // 检查转换是否失败(如字符串非数字) cerr << "转换失败!" << endl; } else { cout << "string转double:" << d << endl; // 输出:456.789 } // 字符串转多个数字(按空格分割) string str_multi = "10 20.5 300"; istringstream iss2(str_multi); int a; double b; int c; iss2 >> a >> b >> c; cout << a << " " << b << " " << c << endl; // 输出:10 20.5 300

2.2.字符串拼接

ostringstream 比直接用 + 拼接字符串更高效(减少临时字符串创建),尤其适合大量拼接场景。

// 低效方式:多次+拼接(产生临时对象) string s1 = "姓名:" + "张三" + ",年龄:" + to_string(20); // 高效方式:ostringstream拼接 ostringstream oss; oss << "姓名:" << "张三" << ",年龄:" << 20 << ",分数:" << 95.5; string s2 = oss.str(); cout << s2 << endl; // 输出:姓名:张三,年龄:20,分数:95.5

2.3.字符串分割

istringstream 配合 >> 或 getline() 可轻松分割字符串(按空格、逗号、冒号等分隔符)。

1.按空格 / 制表符分割(默认)

string str = "apple banana orange grape"; istringstream iss(str); string word; // >> 自动跳过空格/制表符/换行符,读取到下一个分隔符为止 while (iss >> word) { cout << word << endl; } // 输出: // apple // banana // orange // grape

2.按自定义分隔符分割(如逗号、冒号)

需配合 getline() 指定分隔符:

string str = "1,2,3,4,5"; istringstream iss(str); string token; // getline(流, 接收字符串, 分隔符) while (getline(iss, token, ',')) { cout << token << endl; } // 输出: // 1 // 2 // 3 // 4 // 5 // 按冒号分割示例 string str2 = "name:张三:age:20:score:95.5"; istringstream iss2(str2); string t; while (getline(iss2, t, ':')) { cout << t << endl; }

3.进阶用法

1.清空 / 重置 stringstream

stringstream 的清空需注意两个关键点:

  • clear():仅重置流的状态标志(如 eof/fail 标志),不清空内部字符串;
  • str(""):清空内部存储的字符串内容;
  • 如需复用流,需同时调用 clear() + str("")
stringstream ss; ss << "test 123"; cout << "初始内容:" << ss.str() << endl; // 输出:test 123 // 错误:仅clear(),内容仍在 ss.clear(); cout << "仅clear()后:" << ss.str() << endl; // 输出:test 123 // 正确:清空内容 + 重置状态 ss.str(""); // 清空内容 ss.clear(); // 重置状态(避免之前的状态影响后续操作) ss << "new content"; cout << "重置后:" << ss.str() << endl; // 输出:new content

2.获取 / 设置流的内容

  • str():无参数 → 获取流中的字符串;
  • str(const string& s):有参数 → 设置流的初始内容。
stringstream ss; ss.str("初始内容"); // 设置初始内容 cout << ss.str() << endl; // 输出:初始内容 ss << " + 追加内容"; cout << ss.str() << endl; // 输出:初始内容 + 追加内容

4.注意事项

  1. 清空误区:切勿仅用 clear() 清空内容,必须配合 str("")
  2. 性能优势:拼接大量字符串时,ostringstream 远优于 string::operator+(减少内存拷贝);
  3. 错误处理:类型转换 / 分割时,需检查 fail()/good() 状态,避免无效转换(如字符串 "abc" 转 int);
  4. 线程安全stringstream 非线程安全,多线程操作需加锁;
  5. 内存占用stringstream 会缓存数据,大量数据处理后及时清空或析构,避免内存泄漏;
  6. bool 类型输出:默认输出 1/0,需用 boolalpha 操纵符输出 true/false
ostringstream oss; oss << boolalpha << true; // 输出 true oss << noboolalpha << true; // 输出 1(恢复默认)

5.总结

std::stringstream 是 C++ 处理字符串的 “瑞士军刀”,核心价值:

  • 灵活的类型转换(数字↔字符串);
  • 高效的字符串拼接
  • 便捷的字符串分割
  • 所有操作在内存中完成,无 IO 开销,性能优异。

实际开发中,优先用 istringstream 处理 “读 / 解析”、ostringstream 处理 “写 / 拼接”,stringstream 仅在需要双向操作时使用(略占内存)。

Read more

前端小案例——520表白信封

前端小案例——520表白信封

前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页秋刀鱼不做梦-ZEEKLOG博客 在开始讲解这个案例之前,先让我们了解一下本案例所需的前置知识: HTML 布局:创建合适的 HTML 结构,使用标签如 <input>、<label>、<div>、<img> 和 <h1> 等。CSS 布局与样式:设置卡片的外观、尺寸和基本样式,使用 Flexbox 居中布局。CSS 动画与变换:学习如何使用 transform 创建旋转和位移效果,如何使用 transition 来平滑过渡。HTML 与

By Ne0inhk
openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

openclaw新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问

目录 * 1. 基础设施层:OpenClaw 运行环境的初始化 * 2. 算力与模型层:蓝耘 MaaS 平台的接入配置 * 2.1 协议适配与 JSON 配置 * 3. 编排层:OpenClaw 初始化与 Onboarding 流程 * 3.1 模式选择与基础设置 * 3.2 模型提供商与应用集成策略 * 3.3 技能库(Skills)装载与服务启动 * 4. 网络架构与网关(Gateway)配置 * 4.1 网关暴露与安全策略 * 4.2 Web UI 远程访问与设备配对(Device Pairing) * 5. 高级模型编排与 JSON 配置深度解析

By Ne0inhk
纯前端实现Word 文档读取与导出的方案详解

纯前端实现Word 文档读取与导出的方案详解

目录 1. 概述 2. Word 文档导入 3. Word 文档导出 4. 数据流转过程 5. 格式映射关系 6. 技术细节 7. 最佳实践 概述 本方案支持 Word 文档(.docx)的导入和导出,实现了编辑器与 Office 文档格式之间的无缝转换。整体架构如下: Word .docx 文件 ↓ (导入) mammoth 库解析 ↓ HTML 格式 ↓ Tiptap 编辑器 ↓ JSON Content ↓ (导出) docx 库生成 ↓ Word .docx 文件 核心依赖库 库名版本用途mammoth1.11.0Word 文档导入,

By Ne0inhk

Flutter 三方库 web_ffi 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全场景的 Web 浏览器 FFI(外部函数接口)与 WebAssembly 跨平台调用引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 web_ffi 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、全场景的 Web 浏览器 FFI(外部函数接口)与 WebAssembly 跨平台调用引擎 在鸿蒙(OpenHarmony)系统的 Web 浏览器环境(Webview/Ohos Browser)开发高性能 Web 应用时,如何调用现有的 C/C++ 算法库(Wasm 格式)且能保持与原生 HAP 环境下的 dart:ffi 接口完全一致?web_ffi 为开发者提供了一套工业级的、基于 JS 绑定的

By Ne0inhk