• 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;
}

注意事项

  1. 性能考虑:频繁操作 stringstream 可能会影响性能,特别是在循环中大量使用时。

  2. 错误处理:读取失败时(如尝试将非数字字符串转为数字),流会进入错误状态,可通过 fail() 方法检查:

    std::string bad_input = "abc";
    std::istringstream iss(bad_input);
    int value;
    iss >> value;
    
    if (iss.fail()) {
        std::cout << "Conversion failed!" << std::endl;
    }
    
  3. 清空流状态:使用 clear() 方法重置流的错误标志:

    iss.clear();  // 重置错误标志
    

总结

stringstream 是 C++ 中处理字符串与其他数据类型转换、字符串分割和格式化的强大工具。通过将字符串视为流,你可以使用熟悉的输入输出操作符(<<>>)来处理文本数据,使代码更加简洁和可读。

1 条评论

  • @ 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