- C++
stringstream 是 C++ 标准库中的一个强大工具
- 2025-7-31 11:25:42 @
stringstream
是 C++ 标准库中的一个强大工具,用于在内存中进行字符串的输入输出操作,就像操作文件或控制台一样方便。它位于 <sstream>
头文件中,主要有三种类型:
istringstream
:用于从字符串读取数据(输入)。ostringstream
:用于向字符串写入数据(输出)。stringstream
:兼具读取和写入功能。
基本用法:将数据写入字符串流
下面是一个简单的例子,展示如何使用 ostringstream
将不同类型的数据组合成一个字符串:
#include <iostream>
#include <sstream> // 包含 stringstream 相关类
#include <string>
int main() {
std::ostringstream oss; // 创建输出字符串流对象
// 像使用 cout 一样使用 oss
oss << "Hello, ";
oss << "World! ";
oss << "The answer is " << 42 << ".";
// 获取流中的字符串内容
std::string result = oss.str();
std::cout << result << std::endl; // 输出: Hello, World! The answer is 42.
return 0;
}
从字符串读取数据
使用 istringstream
可以将字符串解析为不同类型的数据,类似于 cin
从控制台读取输入:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::string input = "Alice 25 98.5"; // 包含多个值的字符串
std::istringstream iss(input); // 用字符串初始化输入流
std::string name;
int age;
double score;
// 像使用 cin 一样从流中读取数据
iss >> name >> age >> score;
std::cout << "Name: " << name << std::endl; // 输出: Alice
std::cout << "Age: " << age << std::endl; // 输出: 25
std::cout << "Score: " << score << std::endl; // 输出: 98.5
return 0;
}
字符串流的清空与重用
你可以通过 str("")
方法清空字符串流的内容,以便重复使用:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::ostringstream oss;
// 第一次写入
oss << "First line.";
std::cout << oss.str() << std::endl; // 输出: First line.
// 清空流内容
oss.str("");
// 第二次写入
oss << "Second line.";
std::cout << oss.str() << std::endl; // 输出: Second line.
return 0;
}
字符串流的格式化功能
stringstream
支持与 cout
相同的格式化选项,例如设置精度、宽度等:
#include <iostream>
#include <iomanip> // 用于格式化输出
#include <sstream>
#include <string>
int main() {
std::ostringstream oss;
double pi = 3.14159265358979;
// 设置精度为4位小数
oss << std::fixed << std::setprecision(4);
oss << "Pi is approximately: " << pi;
std::cout << oss.str() << std::endl; // 输出: Pi is approximately: 3.1416
return 0;
}
字符串分割示例
stringstream
常用于将字符串按特定分隔符分割成多个部分:
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
int main() {
std::string line = "apple,banana,orange,grape";
std::istringstream iss(line);
std::vector<std::string> fruits;
std::string fruit;
// 按逗号分割字符串
while (std::getline(iss, fruit, ',')) {
fruits.push_back(fruit);
}
// 输出分割结果
for (const auto& f : fruits) {
std::cout << f << std::endl;
}
return 0;
}
数值与字符串的相互转换
stringstream
是实现数值与字符串相互转换的安全方法:
#include <iostream>
#include <sstream>
#include <string>
int main() {
// 数字转字符串
int num = 12345;
std::ostringstream oss;
oss << num;
std::string str_num = oss.str(); // "12345"
// 字符串转数字
std::string str = "678.9";
std::istringstream iss(str);
double d;
iss >> d; // d 的值为 678.9
std::cout << "Number to string: " << str_num << std::endl;
std::cout << "String to number: " << d << std::endl;
return 0;
}
注意事项
-
性能考虑:频繁操作
stringstream
可能会影响性能,特别是在循环中大量使用时。 -
错误处理:读取失败时(如尝试将非数字字符串转为数字),流会进入错误状态,可通过
fail()
方法检查:std::string bad_input = "abc"; std::istringstream iss(bad_input); int value; iss >> value; if (iss.fail()) { std::cout << "Conversion failed!" << std::endl; }
-
清空流状态:使用
clear()
方法重置流的错误标志:iss.clear(); // 重置错误标志
总结
stringstream
是 C++ 中处理字符串与其他数据类型转换、字符串分割和格式化的强大工具。通过将字符串视为流,你可以使用熟悉的输入输出操作符(<<
和 >>
)来处理文本数据,使代码更加简洁和可读。
1 条评论
-
admin SU @ 2025-7-31 11:53:16
#include <iostream> #include <sstream> #include <string> int main() { std::string line = "apple,banana,orange,grape"; line+=','; std::istringstream iss(line); //td::vector<std::string> fruits; std::string fruits[500]; std::string fruit; int cnt = 0; // 按逗号分割字符串 while (std::getline(iss, fruit, ',')) { //fruits.push_back(fruit); cnt += 1; fruits[cnt] = fruit; } for(int i=0;i<=cnt;i++){ std::cout << fruits[i] << std::endl; } return 0; }
- 1