<sstream>
ostringstream和ostream
ostringstream和ostream是 C++ I/O 流体系中紧密相关但职责不同的两个概念。简单来说,ostream是一个基类(抽象概念),而ostringstream是基于内存的具体实现。
std::ostringstream是 C++ 标准库中的安全类,它会自动管理内存,不会导致缓冲区溢出。- 相反,应该避免使用C 风格的
std::ostrstream(已废弃),而推荐使用std::ostringstream。 std::ostream是一个基类,不能直接用于字符串流操作。
| 类名 | 核心头文件 | 常用替代/包含头文件 | 说明 |
|---|---|---|---|
std::ostringstream | <sstream> | 无 | 专门用于将数据格式化输出到std::string对象中。 |
std::ostream | <ostream> | <iostream> | 输出流的基类。std::cout就是std::ostream的一个实例。 |
#include <sstream> // 必须包含这个才能用 ostringstream #include <iostream> // 包含这个通常就有了 ostream,同时也为了使用 cout int main() { // 使用 ostringstream std::ostringstream oss; oss << "Hello "; oss << "World"; std::string result = oss.str(); std::cout << result << std::endl; // 输出: Hello World return 0; }字符串分割
使用 stringstream(适合空格、制表符等空白字符分割)
#include <sstream>
std::stringstream 的 operator>> 默认以任意空白字符(包括空格、\t、\n、\r、\f、\v)作为分隔符。 它会自动跳过多余的空白(包括开头、结尾和中间连续的空白),非常适合解析由空白分隔的“单词”或“字段”。
这种方法主要利用<sstream>头文件中的std::stringstream配合>>操作符。
#include <iostream> #include <string> #include <vector> #include <sstream> // 必须包含的头文件 using namespace std; int main() { // 模拟一段包含多个空格、制表符的文本 string text = "C++ is\tvery\npowerful"; vector<string> result; // 1. 将字符串放入流中 stringstream ss(text); string temp; // 2. 循环读取 // >> 操作符会自动以空白字符(空格、Tab、换行)为分隔符 // 并且会自动忽略连续的空白符 while (ss >> temp) { result.push_back(temp); } // 输出验证 for (const auto& s : result) { cout << "[" << s << "]" << endl; } return 0; }[C++] [is] [very] [powerful]