首页 > 其他分享 >streamstring类介绍

streamstring类介绍

时间:2024-11-16 15:40:28浏览次数:1  
标签:std ss 介绍 streamstring int stringstream 字符串 include

std::stringstream 是 C++ 标准库中提供的一个类,定义在头文件 <sstream> 中。它是基于字符串的流(stream),允许像操作输入流(std::cin)或输出流(std::cout)那样,操作字符串内容。

std::stringstream 是 std::iostream 的派生类,支持同时进行字符串解析(输入)和字符串构造(输出)。

核心概念

std::stringstream 用字符串作为存储介质,模拟流的行为。

主要用于:

  • 从字符串中提取数据(类似 std::cin)。

  • 将数据写入字符串(类似 std::cout)。

常见成员函数

  • 输入与输出

    <<:将数据写入流中(字符串拼接)。

    >>:从流中提取数据(字符串解析)。

  • 绑定与清空

    • str():获取或设置流内的字符串。

    • clear():清除流状态(但不清除内容)。

举几个例子

1. 字符串构造

将多个数据拼接成字符串:

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

int main() {
    std::stringstream ss;
    ss << "Name: " << "Alice" << ", Age: " << 25; // 写入字符串流

    std::string result = ss.str(); // 获取流中的字符串
    std::cout << result << std::endl; // 输出: Name: Alice, Age: 25

    return 0;
}

输出如下:

img

2. 字符串解析

从字符串中提取数据:

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

int main() {
    std::string data = "123 456 789"; // 要解析的字符串
    std::stringstream ss(data);

    int a, b, c;
    ss >> a >> b >> c; // 逐个提取整数

    std::cout << "a: " << a << ", b: " << b << ", c: " << c << std::endl; // 输出: a: 123, b: 456, c: 789

    return 0;
}

输出如下:

img

3. 字符串重用

修改或清空流中的字符串:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;

    // 第一次使用
    ss << "Hello, World!";
    std::cout << ss.str() << std::endl; // 输出: Hello, World!

    // 重用流
    ss.str("");            // 清空内容
    ss.clear();            // 清除状态标志
    ss << "New String!";
    std::cout << ss.str() << std::endl; // 输出: New String!

    return 0;
}

img

插句题外话

如果写成这样:

#include <iostream>
#include <sstream>

int main() {
    std::stringstream ss;

    // 第一次使用
    ss << "Hello, World!";
    std::cout << ss.str() << std::endl; // 输出: Hello, World!

    ss << "New String!";
    std::cout << ss.str() << std::endl; // 输出: New String!

    return 0;
}

输出如下:

img

应用场景

1. 替代 itoa 或 sprintf

std::stringstream 可以将整数或浮点数格式化为字符串:

#include <iostream>
#include <sstream>

int main() {
    int num = 42;
    std::stringstream ss;
    ss << "Number: " << num;

    std::string result = ss.str();
    std::cout << result << std::endl; // 输出: Number: 42

    return 0;
}

输出如下:

img

可以看看这篇博客 将数值转换为字符串的函数,涉及到了itoasprintf

2. 解析复杂字符串

从复杂字符串中提取数据,比如读取配置或处理输入:

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

int main() {
    std::string input = "Name=John;Age=30;Country=USA";
    std::stringstream ss(input);

    std::string item;
    while (std::getline(ss, item, ';')) { // 按分号分割字符串
        std::cout << item << std::endl;
    }

    return 0;
}

输出如下:

img

3. 文件数据处理

用于处理从文件读取的字符串内容:

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

int main() {
    std::ifstream file("data.txt");
    std::stringstream buffer;

    buffer << file.rdbuf(); // 将文件内容读取到字符串流
    std::string content = buffer.str();

    std::cout << "File Content:\n" << content << std::endl;

    return 0;
}

输出如下:

img

其中data.txt内容如下:

img

streamstring类遇到空格或者换行会怎么做

在 C++ 的 std::stringstream 中,空格和换行符的处理取决于使用的输入方式(比如 >> 操作符或 getline 函数):

1. 使用 >> 操作符读取

>> 操作符会将空格和换行符视为分隔符,跳过它们。它会自动提取下一个有效的非空白内容。

比如:

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

int main() {
    std::string input = "Hello World\n42";
    std::stringstream ss(input);

    std::string word;
    int number;

    ss >> word; // 读取第一个单词
    std::cout << "Word: " << word << std::endl; // 输出: Hello

    ss >> word; // 读取第二个单词
    std::cout << "Word: " << word << std::endl; // 输出: World

    ss >> number; // 读取数字
    std::cout << "Number: " << number << std::endl; // 输出: 42

    return 0;
}

输出如下:

img

解释:

  • >> 会跳过所有空白字符(包括空格和换行符)。

  • 每次调用 >> 都会从上次解析停止的位置继续提取。

2. 使用 getline 函数读取

  • std::getline 会按行读取内容,直到遇到换行符 \n

  • 换行符会被作为分隔符,不包含在返回的字符串中。

  • 空格会被视为普通字符,不会跳过。

比如:

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

int main() {
    std::string input = "Hello World\n42";
    std::stringstream ss(input);

    std::string line;
    while (std::getline(ss, line)) { // 按行读取
        std::cout << "Line: " << line << std::endl;
    }

    return 0;
}

输出如下:

img

解释:

  • getline 会读取整行内容直到遇到换行符,换行符本身被丢弃。

  • 每次调用 getline 会从流的当前位置继续读取下一行。

3. 混合读取方式

可以根据需要,使用 >>getline 结合解析内容:

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

int main() {
    std::string input = "Name: John Doe\nAge: 30";
    std::stringstream ss(input);

    std::string label, name;
    int age;

    // 使用 >> 提取部分数据
    ss >> label >> name; // 提取 "Name:" 和 "John"
    std::cout << label << " " << name << std::endl;

    // 使用 getline 处理整行
    std::getline(ss, name); // 提取 " Doe"
    std::cout << "Name (continued):" << name << std::endl;

    // 提取下一行
    ss >> label >> age; // 提取 "Age:" 和 "30"
    std::cout << label << " " << age << std::endl;

    return 0;
}

输出如下:

img

4. 空格与换行的处理差异总结

img

注意事项

  • 效率问题:std::stringstream 适合轻量级字符串处理,但对于频繁的字符串拼接操作,性能可能不如 std::string 直接操作高。

  • 状态清理:在重用 std::stringstream 时,记得使用 str("") 清空内容,并用 clear() 重置流状态。

标签:std,ss,介绍,streamstring,int,stringstream,字符串,include
From: https://www.cnblogs.com/hisun9/p/18549407

相关文章

  • stoi函数介绍
    stoi是C++标准库中的一个函数,定义在头文件<string>中,它用于将字符串转换为整数类型。函数原型intstoi(conststd::string&str,size_t*idx=0,intbase=10);str(必选):要转换的字符串,必须以数字开头(可以包含正负号)。插一句题外话如果不以数字开头,会这样:idx(可......
  • 【ARM CoreLink 系列 1 -- SoC 架构 总线 互联(interconnect) 介绍】
    概述在摩尔定律的推动下,集成电路工艺取得了高速发展,单位面积上的晶体管数量不断增加。片上系统(System-on-Chip,SoC)具有集成度高、功耗低、成本低等优势,已经成为大规模集成电路系统设计的主流方向,解决了通信、图像、计算、消费电子等领域的众多挑战性的难题。随着片上系统SoC的应......
  • 【GraphRAG】本地部署全流程!超详细介绍!
    1、GraphRAG是什么?GraphRAG(Graph-basedRelation-AwareGrouping)是一种基于图的关系感知分组方法,通常用于计算机视觉和机器学习领域。它的核心思想是利用图结构来表示和处理实体之间的关系,从而更有效地进行分组和识别任务。2、本地部署在autodl上进行运行,4090单显卡+24GB内......
  • 统信 UOS 操作系统介绍
    一、前言近年来,软件国产化的呼声越来越高,而操作系统国产化是软件国产化过程中核心的一环,自然也不例外。目前国产操作系统有统信UOS、麒麟(Kylin)和openEuler等,本篇文章为大家介绍统信UOS操作系统,主要包括统信UOS简介版本介绍选择建议与系统展示总结二、统信UOS简介......
  • 云计算&虚拟化-kvm介绍&安装
    作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注作者,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。虚拟化,简单来说就是把一台服务器/PC电脑,虚拟成多台独立的虚拟机,每台虚拟机之间相互隔离,每个虚拟机都有自己独立的操作系统,磁盘,网络资源。虚拟化是一......
  • elastic search 原理介绍
    Elasticsearch原理与实现文档字段1字段索引默认情况下,只有text类型的字段会保存文档ID、词频、词序以外,其余类型字段均只保存文档ID。用户可以在映射字段时通过index_option参数来设置,它的可选值为docs、freqs、positions、offsets,编入索引l的信息依次增加,具体含义如下:do......
  • HTTP协议介绍
    HTTP协议介绍一、HTTP-概述概念:HyperTextTransferProtocol,超文本传输协议,规定了浏览器和服务器之间数据传输规则。特点:1、基于TCP协议:面向连接,安全2、基于请求-响应模型的:一次请求对应一次响应3、HTTP协议是无状态的协议:对于事务处理没有记忆能力。每次请求-响应......
  • 淘宝代购系统;海外代购系统;代购程序,代购系统源码PHP介绍
    以下是关于淘宝代购系统、海外代购系统、代购程序以及代购系统源码PHP的相关介绍:——在成长的路上,我们都是同行者。这篇关于搭建1688淘宝代购集运系统搭建的文章,希望能帮助到您。期待与您继续分享更多跨境系统搭建的知识,请记得关注Taobaoapi2014哦!  淘宝代购系统:......
  • RTP --- 协议介绍
     RTP报文格式12字节头部+payload12字节头部structrtp_hdr{#ifdefBIGENDIANunsignedcharv:2;/*protocolversion*/unsignedcharp:1;/*paddingflag*/unsignedcharx:1;/*headerextensionflag*/un......
  • C++命名空间介绍、定义、作用、是否允许嵌套
    本文章代码块默认为写了std命名空间的条件下,所以代码里面的输出直接写了cout,没写作用域什么是c++命名空间C++命名空间是一种机制,用于解决全局变量名或函数名之间的冲突问题。它可以将一组相关的变量、函数和类组织在一起,形成一个独立的命名空间,避免命名冲突。命名空间通过在......