C++流类库 字符串流

在 C++ 开发中,我们经常需要在字符串与其他数据类型之间相互转换 ,或是拼接多种类型数据 。C++ 流类库提供的字符串流(String Stream),就是专门解决这类问题的强大工具。

字符串流可以将内存中的字符串当作 "输入 / 输出流" 来操作,完美实现类型安全的格式转换、字符串拼接、数据解析,比手动处理字符数组更简洁、更安全。

本文将从字符串流概述、核心类、常用操作、实战场景四个维度,带你掌握字符串流的全部用法。


一、字符串流概述

1. 什么是字符串流?

字符串流是流类库中操作内存字符串 的流类,定义在 <sstream> 头文件中。

不操作文件,只操作内存里的字符串

用法和 cincout 完全一致,学习成本极低

用于:字符串拼接、类型转换、数据解析

2. 字符串流三大核心类

继承标准输入输出流,功能分工明确:

表格

类名 继承自 功能
ostringstream ostream 输出字符串流:向字符串写入数据
istringstream istream 输入字符串流:从字符串读取数据
stringstream iostream 输入输出字符串流:可读可写(最常用)

二、字符串流基本用法

1. 头文件

cpp

cpp 复制代码
#include <sstream>   // 字符串流必备
#include <string>
#include <iostream>
using namespace std;

2. 基础操作流程

  1. 创建字符串流对象
  2. 使用 << 写入数据(像 cout 一样)
  3. 使用 >> 读取数据(像 cin 一样)
  4. .str() 获取 / 设置字符串内容

三、最常用:stringstream 用法

stringstream 支持同时读写,是开发中最常用的字符串流。

1. 写入数据 <<

cpp 复制代码
stringstream ss;
ss << "姓名:" << "张三" << ", 年龄:" << 20 << ", 身高:" << 175.5;
  1. 获取字符串 .str ()
cpp 复制代码
string result = ss.str();  // 把流里的内容转成 string
cout << result << endl;

输出:

cpp 复制代码
姓名:张三, 年龄:20, 身高:175.5

3. 读取数据 >>

可以从字符串中自动解析出不同类型的数据:

cpp 复制代码
stringstream ss("100 3.14 hello");

int a;
double b;
string c;

ss >> a >> b >> c;  // 自动拆分并转换类型
cout << a << " " << b << " " << c << endl;

输出:

cpp 复制代码
100 3.14 hello

四、字符串流三大实战用途

1. 任意类型拼接字符串(替代 sprintf)

传统 C 语言拼接复杂字符串很麻烦,字符串流一行搞定:

cpp 复制代码
int id = 10;
string name = "苹果";
double price = 5.8;

stringstream ss;
ss << "商品编号:" << id << ", 名称:" << name << ", 价格:" << price;

string res = ss.str();

2. 字符串转数字(安全、自动)

无需 atoiatof,类型安全,不会出错:

cpp 复制代码
string str = "12345";
stringstream ss(str);  // 用字符串初始化流

int num;
ss >> num;  // 直接转成 int
  1. 数字转字符串(替代 itoa)
cpp 复制代码
double pi = 3.14159;
stringstream ss;
ss << pi;

string str = ss.str();  // 数字 → 字符串

五、清空与重置字符串流

多次使用同一个字符串流时,需要清空内容 + 清空状态

cpp 复制代码
ss.str("");       // 清空字符串内容
ss.clear();       // 清空流错误状态

示例:

cpp 复制代码
stringstream ss;
ss << 100;

ss.str("");   // 清空
ss << 200;    // 重新使用

六、综合实战示例

示例 1:字符串拆分与类型解析

把一行文本自动解析成多种类型:

cpp 复制代码
#include <sstream>
#include <iostream>
using namespace std;

int main() {
    string data = "Tom 18 95.5";
    stringstream ss(data);

    string name;
    int age;
    double score;

    ss >> name >> age >> score;

    cout << "姓名:" << name << endl;
    cout << "年龄:" << age << endl;
    cout << "分数:" << score << endl;
    return 0;
}

示例 2:多类型数据拼接

cpp 复制代码
stringstream ss;
ss << "ID:" << 1001 << ", 状态:" << true << ", 精度:" << 0.001;
cout << ss.str() << endl;

七、字符串流常用成员函数

表格

函数 作用
ss << 数据 向流写入数据
ss >> 变量 从流读取数据到变量
ss.str() 获取流中的字符串
ss.str("内容") 设置字符串内容
ss.clear() 清空流状态
ss.empty() 判断是否为空

八、字符串流 vs 传统方法

表格

方式 优点 缺点
字符串流 类型安全、代码简洁、支持任意类型、无缓冲区溢出 略微多占一点内存
sprintf / sscanf 速度快 类型不安全、容易溢出、代码复杂

九、总结

字符串流是 C++ 流类库中处理字符串最方便的工具

核心要点

  1. 头文件:<sstream>
  2. 三大类:istringstreamostringstreamstringstream
  3. 最常用:stringstream(可读可写)
  4. 核心操作:
    • << 写入
    • >> 读取
    • .str() 获取字符串
  5. 三大用途:字符串拼接、类型转换、数据解析
  6. 清空:str("") + clear()

掌握字符串流,你就能轻松处理所有字符串与数字互转、复杂字符串拼接问题。

总结

  1. 字符串流操作内存字符串,用法与标准 I/O 一致
  2. stringstream 功能最全面,支持读写
  3. 可轻松实现数字转字符串、字符串转数字、多类型拼接、数据拆分
  4. 比 C 语言函数更安全、简洁、易维护
  5. 清空流用 str("")clear()
相关推荐
weixin_520649872 小时前
C#线程底层原理知识
java·开发语言
AC赳赳老秦2 小时前
OpenClaw与Excel联动:批量读取/写入数据,生成可视化报表
开发语言·python·excel·产品经理·策略模式·deepseek·openclaw
code_whiter2 小时前
C++9(vector)
开发语言·c++
覆东流2 小时前
第5天:Python字符串操作进阶
开发语言·后端·python
吴梓穆2 小时前
UE5 C++ 使C++创建动画蓝图
开发语言·c++·ue5
冰暮流星2 小时前
javascript之表单事件1
开发语言·前端·javascript
0xDevNull2 小时前
队列(Queue)实战教程:从原理到架构应用
java·开发语言·后端
conti1232 小时前
水题记录2.4
c++·笔记·题解