C++ stringstream详解-类型转换‌、‌字符串拼接‌和‌分割字符串‌专业工具

C++ stringstream详解-类型转换‌、‌字符串拼接‌和‌分割字符串‌专业工具 C stringstream详解-类型转换‌、‌字符串拼接‌和‌分割字符串‌专业工具一、stringstream详解1、核心功能2、主要成员函数3、使用场景4、注意事项5、总结二、代码示例1、源码分享2、运行结果一、stringstream详解std::stringstream是 C 标准库sstream头文件中提供的一个类。它继承自std::iostream主要用于在内存中对字符串进行流式操作就像操作文件流 (std::ifstream,std::ofstream) 或标准输入输出流 (std::cin,std::cout) 一样。1、核心功能字符串拼接你可以像使用std::cout一样使用插入操作符将各种类型的数据整数、浮点数、字符、字符串、其他流等输出写入到stringstream内部的字符串缓冲区中。例如std::stringstream ss;ssHello, World! 2024;std::string resultss.str();// result 现在是 Hello, World! 2024类型转换你可以像使用std::cin一样使用提取操作符从stringstream内部的字符串中读取数据并将其转换为指定的类型。例如std::string input123 45.67 hello;std::stringstreamss(input);// 用字符串初始化 stringstreamintnum;doubled;std::string str;ssnum;// num 123ssd;// d 45.67ssstr;// str hello格式化字符串由于stringstream是一个流你可以使用标准流操纵符如std::hex,std::setprecision,std::setw,std::fixed等来控制数据的格式。例如std::stringstream ss;ssstd::hex255;// 以十六进制输出std::string hexStrss.str();// hexStr 是 ff字符串解析结合操作符和循环或条件判断可以方便地解析格式化的字符串如 CSV 行、配置文件行、日志行等。例如解析逗号分隔的值std::string csvLineJohn,Doe,30;std::stringstreamss(csvLine);std::string firstName,lastName;intage;charcomma;ssfirstNamecommalastNamecommaage;动态构建字符串比多次调用或运算符更高效且更易读尤其是在需要插入不同类型的数据时。2、主要成员函数str(): 获取或设置stringstream内部管理的字符串。无参std::string str() const;返回当前缓冲区内容的副本。有参void str(const std::string s);用字符串s设置缓冲区的内容并清除状态标志。clear(): 清除流的状态标志如eofbit,failbit,badbit。在复用同一个stringstream对象进行多次读写时通常需要在设置新内容 (str()) 后调用clear()来重置错误状态。3、使用场景将数值转换为字符串int num 42; std::string s (std::stringstream() num).str();将字符串转换为数值std::string s 3.14; double pi; std::stringstream(s) pi;格式化输出到字符串替代sprintf。解析来自文件、网络或用户输入的格式化的字符串数据。在内存中构建复杂或动态的字符串消息。4、注意事项复用如果想复用同一个stringstream对象来处理不同的字符串需要先清空内容并重置状态ss.str();// 清空缓冲区内容ss.clear();// 重置错误状态标志错误处理在类型转换时使用如果转换失败如试图将非数字字符串读入int流会设置failbit。使用前检查状态或使用异常是良好的实践if(!(ssnum)){// 处理转换失败}性能对于非常简单的转换单个数值转字符串使用std::to_string可能更简洁高效。但stringstream在复杂格式化或多次操作时更灵活。格式化控制其格式化能力不如专门的格式化库强大。5、总结std::stringstream是 C 中处理字符串、进行类型转换和格式化的强大工具。它提供了流式接口使得在内存中操作字符串变得非常方便和灵活是连接字符串世界和流式 IO 世界的重要桥梁。二、代码示例1、源码分享#includeiostream#includesstream#includestring#includeiomanip#includevectorstructStudent{intid;std::string name;floatscore;boolisPass;};intmain(){// 1. 序列化 std::cout 1. 序列化多类型数据 → 字符串\n;std::stringstream ss;Student stu{1001,张三,89.567f,true};ssstu.id stu.name std::fixedstd::setprecision(2)stu.score std::boolalphastu.isPass;std::string data_strss.str();std::cout序列化结果data_str\n\n;// 2. 重置 ss.str();ss.clear();// 3. 反序列化修复版std::cout 2. 反序列化字符串 → 多类型数据\n;// 去掉中文前缀只保留纯数据std::string raw_data1002 李四 76.23 false;ss.str(raw_data);intid;std::string name;floatscore;boolisPass;ssidnamescoreisPass;if(ss.fail()){std::cerr解析失败数据类型不匹配\n;return1;}std::cout解析成功\n学号id\n姓名name\n分数score\n是否及格std::boolalphaisPass\n\n;// 4. 分割字符串 std::cout 3. 分割带分隔符的字符串 std::endl;std::string split_str2025-06-20 14:30:25;C编程;98.5;std::stringstreamss_split(split_str);std::vectorstd::stringparts;std::string part;std::getline(ss_split,part, );parts.push_back(part);while(std::getline(ss_split,part,;)){parts.push_back(part);}std::cout分割后的数据\n;for(size_t i0;iparts.size();i){std::cout[i] parts[i]\n;}// 5. 格式化输出 std::cout\n 4. 格式化字符串输出 std::endl;ss.str();ss.clear();ssstd::leftstd::setw(10)学号std::setw(10)姓名std::setw(8)分数std::setw(10)状态\nstd::setw(10)1001std::setw(10)张三std::fixedstd::setprecision(1)std::setw(8)89.6std::setw(10)及格;std::coutss.str()std::endl;return0;}2、运行结果1.序列化多类型数据 → 字符串序列化结果1001张三89.57true2.反序列化字符串 → 多类型数据解析成功 学号1002姓名李四 分数76.23是否及格false3.分割带分隔符的字符串分割后的数据[0]2025-06-20[1]14:30:25[2]C编程[3]98.54.格式化字符串输出学号 姓名 分数 状态1001张三89.6及格 C:\Users\徐鹏\Desktop\新建文件夹\Project1\x64\Debug\Project1.exe(进程10632)已退出代码为0(0x0)。 要在调试停止时自动关闭控制台请启用“工具”-“选项”-“调试”-“调试停止时自动关闭控制台”。 按任意键关闭此窗口...