1. 简述
std::stringstream是C++标准库中提供的字符串流操作类,提供了istringstream、ostringstream两个子类,使用时需要包含<sstream>头文件。
2. std::istringstream
istringstream是stringstream提供的用于管理输入字符串的类,一般用于从字符串流中提取数据,如整形、浮点型、字符串型等。
类似于std::cin,std::cin用于处理标准输入,std::istringstream用于处理字符串流输入。
举例,如从一个字符串中提取整形、字符串等,参考如下程序。
#include <sstream>
#include <iostream>
#include <string>
int main() {
std::string pos = "Longitude: 127.123456,Latitude: 37.654321,Altitude: 122.12";
std::istringstream iss(pos);
std::string item;
while(std::getline(iss, item, ',')){ ///< 使用istringstream与getline配合,分割字符串.
std::cout << "Get pos item: " << item << std::endl;
std::istringstream item_iss(item);
std::string pos_name;
float pos_value;
item_iss >> pos_name; ///< 从字符串流中提取字符串
if(pos_name.back() == ':'){
pos_name.pop_back();
}
item_iss >> pos_value; ///< 从字符串流中提取浮点类型的值
printf("%s: %f\n", pos_name.data(), pos_value);
}
return 0;
}
程序中,pos_name和pos_value是分别从字符串流中提取的字符串类型的名字和浮点类型的值。
3. std::ostringstream
ostringstream常用来构建复杂字符串,格式化输出。数据类型,并组合字符串。
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
int main() {
/** 创建一个ostringstream对象. */
std::ostringstream oss;
float longitude = 127.123456;
float latitude = 37.654321;
float altitude = 122.12;
/** 写入数据. */
oss << "Latitude: " << longitude << std::endl;
oss << "Longitude: " << latitude << std::endl;
oss << "Altitude: " << altitude << std::endl;
/** 析出字符串. */
std::string result = oss.str();
/** 打印字符串. */
std::cout << result << std::endl;
return 0;
}
4. 配合getline分割字符串
在前面istringstream的例子中,我们已经用到了getline来分割字符串。
#include <fstream>
#include <sstream>
#include <iostream>
#include <string>
int main() {
std::ifstream file("data.txt"); // 假设文件data.txt中有逗号分隔的数据
std::string line;
while (std::getline(file, line)) {
// 使用std::stringstream处理每一行
std::stringstream ss(line);
std::string item;
while (std::getline(ss, item, ',')) { // 以逗号为分隔符分割字符串
std::cout << item << std::endl; // 输出分割后的字符串
}
}
file.close();
return 0;
}