C++ 字符串流化 stringstream

   

目录

原理

1. std::stringstream 概述

2. 内部机制

3. 工作原理

写入数据

读取数据

4. 主要操作

妙用

1. 将数据格式化为字符串

2. 从字符串解析数据

3. 字符串到数值转换、 数值到字符串转换

4. 合并字符串

5. 动态生成 SQL 查询

6. 日志系统

7. 基于模板生成代码

8. URL 解析

9. 生成 HTML

10. 动态命令行生成

总结

附:自定义 MyStringStream 类


     

        C++ 中的字符串流化(string stream)是通过标准库提供的 std::stringstream 实现的。std::stringstreamstd::iostream 的子类,它允许我们将字符串作为流进行读写操作。下面我将解释字符串流化的原理,包括其内部机制和工作方式。

原理

1. std::stringstream 概述

  std::stringstream 位于 <sstream> 头文件中,是 std::basic_stringstream<char> 的类型定义。它是一个模板类,继承自 std::iostream,可以同时进行输入和输出操作。

2. 内部机制

  std::stringstream 的核心是使用一个 std::stringbuf 对象,该对象是 std::basic_stringbuf<char> 的实例。std::stringbuf 提供了将字符串作为流缓冲区的能力。

  • std::stringbuf:该类继承自 std::basic_streambuf<char>,用于管理内部字符串缓冲区。它提供了读写字符串的接口。
  • std::stringstream:组合了 std::istreamstd::ostream 的功能,通过 std::stringbuf 实现对字符串的读写操作。

3. 工作原理

  std::stringstream 使用内部的 std::stringbuf 对象来存储和管理字符串数据。std::stringbuf 维护一个内部缓冲区(即 std::string 对象),可以通过流操作将数据写入或从中读取。

写入数据
  • 当我们向 std::stringstream 写入数据时,数据被插入到内部缓冲区中。
  • 流操作符(<<)重载实现了对各种数据类型的格式化写入。
std::stringstream ss;
ss << 123 << " " << 45.67;  // 将整数和浮点数写入字符串流
读取数据
  • 当我们从 std::stringstream 读取数据时,数据从内部缓冲区中提取。
  • 流操作符(>>)重载实现了对各种数据类型的解析读取。
std::stringstream ss("123 45.67");
int a;
double b;
ss >> a >> b;  // 从字符串流中读取整数和浮点数

4. 主要操作

  • 插入数据:使用 << 操作符将数据插入到字符串流中。
  • 提取数据:使用 >> 操作符从字符串流中提取数据。
  • 获取字符串:使用 str() 方法获取内部缓冲区的字符串表示。
  • 设置字符串:使用 str(const std::string& s) 方法设置内部缓冲区的内容。
  • 清空流:使用 str("")clear() 清空流内容和状态。
#include <iostream>
#include <sstream>
#include <string>int main() {// 创建一个字符串流对象std::stringstream ss;// 写入数据到字符串流int num = 42;double pi = 3.14159;ss << "Number: " << num << ", Pi: " << pi;// 获取字符串流的内容std::string str = ss.str();std::cout << "Stream content: " << str << std::endl;// 清空字符串流ss.str("");ss.clear();// 写入新的数据到字符串流std::string data = "123 45.67";ss.str(data);// 从字符串流读取数据int a;double b;ss >> a >> b;std::cout << "Extracted values: a = " << a << ", b = " << b << std::endl;return 0;
}

妙用

1. 将数据格式化为字符串

        使用 std::stringstream 可以将各种类型的数据格式化为字符串。

#include <iostream>
#include <sstream>
#include <string>int main() {std::stringstream ss;int n = 42;double pi = 3.14159;// 向字符串流中插入数据ss << "The value of n is " << n << " and the value of pi is " << pi;// 将字符串流转换为字符串std::string result = ss.str();std::cout << result << std::endl;return 0;
}

2. 从字符串解析数据

        使用 std::stringstream 可以从字符串中解析出不同类型的数据。

#include <iostream>
#include <sstream>
#include <string>int main() {std::string data = "42 3.14159";std::stringstream ss(data);int n;double pi;// 从字符串流中提取数据ss >> n >> pi;std::cout << "The value of n is " << n << " and the value of pi is " << pi << std::endl;return 0;
}

3. 字符串到数值转换、 数值到字符串转换

#include <iostream>
#include <sstream>
#include <string>int main() {std::string numberStr = "12345";int number;std::stringstream ss(numberStr);ss >> number;if (ss.fail()) {std::cout << "Conversion failed!" << std::endl;} else {std::cout << "Converted number: " << number << std::endl;}return 0;
}
#include <iostream>
#include <sstream>
#include <string>int main() {int number = 12345;std::stringstream ss;ss << number;std::string numberStr = ss.str();std::cout << "Converted string: " << numberStr << std::endl;return 0;
}

4. 合并字符串

  std::stringstream 可以用于高效地拼接多个字符串。

#include <iostream>
#include <sstream>
#include <string>int main() {std::string firstName = "John";std::string lastName = "Doe";int age = 30;std::stringstream ss;ss << "Name: " << firstName << " " << lastName << ", Age: " << age;std::string result = ss.str();std::cout << result << std::endl;return 0;
}

5. 动态生成 SQL 查询

  std::stringstream 可以用于动态生成复杂的 SQL 查询语句。

#include <iostream>
#include <sstream>
#include <string>std::string generateSQLQuery(const std::string& tableName, const std::string& column, int value) {std::stringstream ss;ss << "SELECT * FROM " << tableName << " WHERE " << column << " = " << value;return ss.str();
}int main() {std::string query = generateSQLQuery("users", "age", 25);std::cout << "Generated SQL Query: " << query << std::endl;return 0;
}

6. 日志系统

#include <iostream>
#include <sstream>
#include <string>
#include <fstream>class Logger {
public:void log(const std::string& message) {std::stringstream ss;ss << "[INFO] " << message;writeLog(ss.str());}void logError(const std::string& message) {std::stringstream ss;ss << "[ERROR] " << message;writeLog(ss.str());}private:void writeLog(const std::string& logEntry) {std::ofstream logFile("log.txt", std::ios_base::app);logFile << logEntry << std::endl;}
};int main() {Logger logger;logger.log("This is an information message.");logger.logError("This is an error message.");return 0;
}

7. 基于模板生成代码

  std::stringstream 可以用于代码生成工具,通过模板生成不同的代码片段。

#include <iostream>
#include <sstream>
#include <string>std::string generateFunction(const std::string& returnType, const std::string& functionName, const std::string& params) {std::stringstream ss;ss << returnType << " " << functionName << "(" << params << ") {\n";ss << "    // function body\n";ss << "}\n";return ss.str();
}int main() {std::string code = generateFunction("int", "add", "int a, int b");std::cout << "Generated Function Code:\n" << code << std::endl;return 0;
}

8. URL 解析

#include <iostream>
#include <sstream>
#include <string>
#include <map>std::map<std::string, std::string> parseURLParameters(const std::string& url) {std::map<std::string, std::string> params;std::string::size_type pos = url.find('?');if (pos == std::string::npos) {return params;}std::string query = url.substr(pos + 1);std::stringstream ss(query);std::string param;while (std::getline(ss, param, '&')) {std::string::size_type eqPos = param.find('=');if (eqPos != std::string::npos) {std::string key = param.substr(0, eqPos);std::string value = param.substr(eqPos + 1);params[key] = value;}}return params;
}int main() {std::string url = "http://example.com/page?param1=value1&param2=value2&param3=value3";std::map<std::string, std::string> params = parseURLParameters(url);std::cout << "Parsed URL Parameters:" << std::endl;for (const auto& param : params) {std::cout << param.first << ": " << param.second << std::endl;}return 0;
}

9. 生成 HTML

#include <iostream>
#include <sstream>
#include <string>
#include <vector>std::string generateHTML(const std::vector<std::string>& items) {std::stringstream ss;ss << "<ul>\n";for (const auto& item : items) {ss << "  <li>" << item << "</li>\n";}ss << "</ul>";return ss.str();
}int main() {std::vector<std::string> items = {"Item 1", "Item 2", "Item 3"};std::string html = generateHTML(items);std::cout << "Generated HTML:\n" << html << std::endl;return 0;
}

10. 动态命令行生成

#include <iostream>
#include <sstream>
#include <string>std::string generateCommand(const std::string& command, const std::vector<std::string>& args) {std::stringstream ss;ss << command;for (const auto& arg : args) {ss << " " << arg;}return ss.str();
}int main() {std::vector<std::string> args = {"-o", "output.txt", "-i", "input.txt", "--verbose"};std::string command = generateCommand("my_program", args);std::cout << "Generated Command: " << command << std::endl;return 0;
}

总结

        可以看到 std::stringstream 在各种实际编程任务中都有广泛的应用。不论是格式化输出、数据解析、生成动态内容,还是处理多行文本、生成命令行字符串等,std::stringstream 都提供了灵活且强大的解决方案。这些示例展示了 std::stringstream 的多种妙用,希望能帮助你更好地理解和应用这一强大的工具。

附:自定义 MyStringStream

#include <iostream>
#include <string>
#include <sstream>class MyStringStream {
public:MyStringStream() {}// 写入数据到流template<typename T>MyStringStream& operator<<(const T& value) {buffer << value;return *this;}// 从流中读取数据template<typename T>MyStringStream& operator>>(T& value) {buffer >> value;return *this;}// 获取流的内容std::string str() const {return buffer.str();}// 设置流的内容void str(const std::string& s) {buffer.str(s);}// 清空流void clear() {buffer.str("");buffer.clear();}private:std::stringstream buffer;
};int main() {MyStringStream myStream;// 写入数据myStream << "Hello, " << "world! " << 123 << " " << 45.67;// 获取流内容std::string content = myStream.str();std::cout << "Stream content: " << content << std::endl;// 清空流myStream.clear();myStream << "New content: " << 789;content = myStream.str();std::cout << "Stream content after clear: " << content << std::endl;// 设置流内容myStream.str("100 200");int a, b;myStream >> a >> b;std::cout << "Extracted values: a = " << a << ", b = " << b << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/31176.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习 - MySQL视图的练习 实例

视图的概念 视图是什么&#xff1f; 一个虚拟的表视图存储的是什么 存储的是SQL逻辑&#xff0c;在使用视图时&#xff0c;会动态执行SQL逻辑&#xff0c;生成临时的表视图的优点 保密性好 简化操作视图的语法 先按照DML练习到插入为止 为student创建视图view_student&#xff…

C#.net6.0语言+前端Vue,Ant-Design开发的智慧医院手术室麻醉管理平台源码 什么是手术麻醉临床信息管理系统?

C#.net6.0语言前端Vue,Ant-Design开发的智慧医院手术室麻醉管理平台源码 什么是手术麻醉临床信息管理系统&#xff1f; 手术麻醉临床信息管理系统涵盖了手术进程管理、自动排班、手术记录、术前评估与麻醉记录等功能&#xff0c;强调了系统如何通过技术架构和数据集成提高工作…

前端面试题日常练-day78 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 在Sass中&#xff0c;以下哪个功能用于创建一个循环&#xff1f; a) extend b) for c) import d) include Sass中的混合器&#xff08;Mixins&#xff09;可以包含以下哪些内容&#xff1f; a) 样式规…

44、基于深度学习的癌症检测(matlab)

1、基于深度学习的癌症检测原理及流程 基于深度学习的癌症检测是利用深度学习算法对医学影像数据进行分析和诊断&#xff0c;以帮助医生准确地检测癌症病变。其原理和流程主要包括以下几个步骤&#xff1a; 数据采集&#xff1a;首先需要收集包括X光片、CT扫描、MRI等医学影像…

JAVA-线程

先上图&#xff0c;有点长&#xff0c;比较碎&#xff0c;有xmind文件......&#xff0c;详细内容均在图片里介绍了&#xff0c;提供了PDF文件 1.线程简介 进程是操作系统中正在执行的不同的应用程序&#xff0c;例如&#xff1a;我们可以同时打开Word和记事本 线程是一个应用…

Java中的缓存设计与优化策略

Java中的缓存设计与优化策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨在Java应用程序中&#xff0c;如何设计和优化缓存策略&#xff0c;以…

Java——IDEA使用

一、IDEA介绍 IntelliJ IDEA 是 JetBrains 公司开发的一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;主要用于 Java 编程语言&#xff0c;但也支持多种其他语言和框架。由于其强大的功能和灵活性&#xff0c;IntelliJ IDEA 被广泛应用于软件开发领域&…

海外盲盒小程序搭建过程的最大挑战:文化差异与本地化

一、引言 随着全球化的深入发展&#xff0c;跨境电商和海外市场的拓展成为许多企业的重要战略方向。盲盒小程序作为一种新兴的消费模式&#xff0c;也在海外市场展现出巨大的潜力。然而&#xff0c;在海外搭建盲盒小程序并非易事&#xff0c;文化差异与本地化问题是其搭建过程…

UniApp 开发微信小程序教程(二):下载安装微信开发者工具

文章目录 一、微信开发者工具简介二、下载安装微信开发者工具1. 下载微信开发者工具步骤&#xff1a; 2. 安装微信开发者工具Windows 系统&#xff1a;Mac 系统&#xff1a; 3. 配置微信开发者工具登录微信开发者工具&#xff1a;新建项目&#xff1a; 4. 预览和调试预览&#…

番外篇 | FFCA-YOLO复现:面向遥感图像的小目标检测最新方法 | 解决小目标检测特征表示不足和背景混淆等问题

前言:Hello大家好,我是小哥谈。在论文中,作者的动机是设计一个高精度同时具备潜在的实时处理能力的小目标检测器。由此,作者首先分别提出了特征增强模块(FEM)与空间上下文感知模块(SCAM)来丰富局部和全局的上下文特征信息。其中,FEM通过多分支卷积拓宽了骨干网络的感受…

一个软件是如何开发出来的呢?

一、前言 如今&#xff0c;AI大爆发的时代&#xff0c;作为一名IT从业者&#xff0c;你是否也想尝试开发一套自己的系统&#xff0c;实现那些看似有可能实现的天马行空的想法&#xff0c;变成一个优秀甚至伟大的产品&#xff0c;甚至带来某个行业的革新&#xff0c;那作为一名…

【51单片机基础教程】点亮led

文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成电路&#xff0c;广泛应用于各种电子产品中。作为嵌入…

万界星空科技MES系统中的仓库管理功能

制造执行系统&#xff08;Manufacturing Execution System&#xff0c;简称MES&#xff09;作为一种面向车间生产调度的管理信息系统&#xff0c;被广泛应用在车间作业调度和控制管理系统中&#xff0c;它以实现车间生产调度最优化为目标。同时&#xff0c;MES作为衔接ERP&…

【笔记】打卡02 | 初学入门

平台上运行很慢。。。是为什么&#xff1f; 明明就是简单的张量运算。。是算力资源&#xff1f;网络&#xff1f;运算设计问题&#xff1f; 03张量 Tensor 张量是一种特殊的数据结构&#xff0c;与数组和矩阵非常相似。 库 import numpy as np import mindspore from minds…

分布式ID生成方案之雪花算法

目录 前言 1、什么是分布式ID? 2、雪花算法结构 3、雪花算法的优势 4、雪花算法的实现 5、总结 前言 当我首次接触到这个算法时&#xff0c;便被其富有诗意的名字所吸引。雪花&#xff0c;亦称未央花,"未央"意味着永恒与无限&#xff0c;象征着希望与未来&am…

江苏 服务器性能监控包含哪些方面?

服务器的性能监控主要是为了确保服务器能够正常运行工作和性能优化的重要手段&#xff0c;接下来就来看一下服务器性能监控所包含的内容有哪些吧&#xff01; 首先对于服务器的系统资源进行一定的监控&#xff0c;CPU作为服务器的核心组件之一&#xff0c;所以我们要监控CPU的使…

【elementui】el-tree开启show-checkbox,点击叶子节点触发勾选

如图所示&#xff0c;el-tree开启show-checkbox&#xff0c;仅在点击红色区域(叶子节点)触发勾选&#xff0c;点击绿色区域(非叶节点)不触发勾选。 若是用开启check-on-node-click的方式&#xff0c;会出现点击非叶节点也触发勾选&#xff0c;由于我的tree是默认不展开的&#…

Spring (71)Spring Boot Actuator

Spring Boot Actuator是Spring Boot的一个子项目&#xff0c;提供了一系列生产级别的特性&#xff0c;帮助你监控和管理Spring Boot应用程序。Actuator通过HTTP、JMX或其他协议暴露应用程序的内部运行情况。这包括但不限于应用程序的健康状况、已配置的环境属性、线程情况、已注…

Java泛型,数据结构,List,Set详细介绍

泛型,数据结构,List,Set 介绍内容 泛型使用 数据结构 List Set 1 泛型 1.1 泛型的介绍 泛型是一种类型参数&#xff0c;专门用来保存类型用的 最早接触泛型是在ArrayList&#xff0c;这个E就是所谓的泛型了。使用ArrayList时&#xff0c;只要给E指定某一个类型&#xf…

戴尔外星人原厂系统美版改国行正确识别本机SN,支持F12 Support Assist OS Recevory恢复重置识别SN服务编码

1.重新部署可以永久正确识别My Alienware和Support Assist服务编码 原厂系统远程恢复安装&#xff1a;https://pan.baidu.com/s/166gtt2okmMmuPUL1Fo3Gpg?pwdm64f 提取码:m64f 2.安装有两个软件和官网主页会识别原机的SN码&#xff0c;就是本机服务编码&#xff08;my Alie…