stringstream
引言
在 C++ 中,stringstream 是一个非常强大且实用的字符串流处理类。它允许我们将字符串当作流(类似 cin 和 cout)来进行读写操作,主要用于字符串的格式化、类型转换和数据解析
由于笔者在学习这部分内容时没有找到自己喜欢的文章,遂自己动手写一篇,希望接下来我 最直白、最不绕弯子、最直接、最硬核、最干脆、最不墨迹、最戳痛点、最开门见山、最单刀直入、最不铺垫、最不客套、最不煽情、最不废话、最不拐弯、最不磨叽、最不装、最不端着、最不啰嗦、最不拖沓、最不委婉、最不掩饰、最不藏着掖着、最露骨、最实在、最底层 的介绍能帮到你。(参考文献——豆包大人)
基础操作
头文件
include<sstream>
构造
-
基础构造(空流):
stringstream ss; -
用字符串初始化:
string data = "Hello World";
stringstream ss(data);
or
stringstream ss("Hello");
获取字符串内容
string s = ss.str();
写入数据(拼接字符串)
使用 << 运算符将 各种类型的数据 写入流中。
例如:
int age = 25;
double score = 98.5;
ss << "姓名:小明" << "\n年龄:" << age << "\n分数:" << score;
最后cout<<ss.str();得到如下运行结果

读取数据(解析字符串)
使用 >> 运算符从流中提取数据,默认以空白字符(空格、换行等)作为分隔符。
string data = "小明 179.5";
stringstream ss(data);
string name; //姓名
float stature; //身高
ss >> name >> stature; //提取并装入变量
加上cout << "姓名:" << name << "\n身高:" << stature << " cm";后运行结果be like:

补充:如果分隔符为非空白字符,如 ** (逗号), **
核心语法:getline(流对象, 接收变量, '自定义分隔符')
string data = "apple,banana,cherry,date";
stringstream ss(data);
string token;
while (getline(ss, token, ',')) {
cout << token << endl;
}
Q&A:
- 最后一个字符串没有逗号能正常读取吗?
完全可以。
getline 的读取逻辑是:从当前位置开始读取,直到遇到指定的分隔符(如逗号)或者到达文件/流的末尾(EOF)。 这意味着,即使最后一部分后面没有逗号,只要流还没结束,它依然会被成功提取出来。 - getline 会有危险吗?
有的兄弟有的
陷阱一:连续逗号会产生空字符串,末尾的逗号也会产生空字符串
如果数据是 “a,,b”,getline 会忠实地切分出 “a”、“”(空字符串)、“b”。
如果数据是 “x,y,z,”,最后一次 getline 会读出一个空字符串 “”。
陷阱二:不会自动去除首尾空格
如果数据是"a,b, c",提取出来的分别是"a",“b”," c"。getline 只认逗号,不管里面的空格。
陷阱三:不支持引号转义(高级 CSV 特性)
如果数据是 ““a,b”,c”,getline 遇到第一个逗号就会切断,它无法识别双引号包裹的合法逗号。
正确重用方式
ss.str(""); // 清空内容
ss.clear(); // 清除状态标志

9887

被折叠的 条评论
为什么被折叠?



