dedecms 做的医院网站,运动鞋官方网站建设计划书,电子政务网站建设出版社,濮阳新闻综合频道直播我们在 sstream 头文件中定义了三个类型来支持内存IO(ostringstream\istringstream\stringstream)#xff0c;这些类型可以向 string 写入数据#xff0c;这里我们主要讲#xff1a; std::ostringstream 和 std::istringstream( C Primer 中文版第五版)
以上的两个类型都继…我们在 sstream 头文件中定义了三个类型来支持内存IO(ostringstream\istringstream\stringstream)这些类型可以向 string 写入数据这里我们主要讲 std::ostringstream 和 std::istringstream( C Primer 中文版第五版)
以上的两个类型都继承自我们经常使用的 iostream 头文件中定义的类型。并且他们还增加了一下成员来管理与流相关的 string。
也就是说他们使得我们能够像控制IO流一样控制 string。 文章目录 std::ostringstream使用场景一序列化数据使用场景二拼接字符串使用场景三格式化输出 std::istringstream使用场景一解析输入使用场景二反序列化数据 std::ostringstream
常用方法 操作符用于将数据格式化并写入到 ostringstream 中str() 返回当前流中的字符串clear() 清楚流中的数据。seekp()用于调整输出指针的位置便于覆盖或插入内容适用于一些高级场景
它有一个很典型的场景
逐步构造输出希望最后一起打印时ostringstream 非常有用。
比如逐个验证电话号码并改变其格式等等。
使用场景一序列化数据
这里就典型使用到了我们的逐步构造输出希望最后一起打印。
std::string serialize(TreeNode* root) {std::ostringstream out;if (!root) {out null ;} else {out root-val ;out serialize(root-left);out serialize(root-right);}return out.str();
}使用场景二拼接字符串
这个也是我们的逐步构造输出希望最后一起打印。
#include iostream
#include sstreamint main () {std::ostringstream out;int number 42;std::string text The answer is;out text number .;std::string result out.str();std::cout result std::endl; // 输出The answer is 42.return 0;
}使用场景三格式化输出
当需要对输出进行格式化例如控制浮点数的小数位数、控制数字格式等ostringstream 可以帮助我们简化这类操作。
#include sstream
#include iostream
#include iomanip // 控制浮点数京都int main () {std::ostringstream out;double pi 3.14159265358979323;// 设置京都为小数点后两位out std::fixed std::setprecision(2) pi;std::out Formatted pi: out.str() std::endl;return 0;
}std::istringstream 操作符从字符串流中提取数据。可以从字符串中逐个提取数据并将其转换为相应的类型。str() 设置或返回当前字符串流中的内容。clear() 重置流的状态使流可以重用。seekg() 调整输入流指针的位置通常用于重新读取数据或跳过某些数据。
使用场景一解析输入
int main () {std::string inpit 42 3.14 Hello;std::istringstream iss(input);int number;double pi;std::string text;iss number pi text;
}注意我们的 操作符更适合用于逐个提取空格分隔的值。
这里我们列举一个 getline 的用法
// getline 读取文件内容
int main () {std::ifstream file(input.txt);std::string line;if (file.is_open()) {while (std::getline(file, line)) {std::cout line std::endl; //输出每行内容getline 会逐行读取直到遇到文件结束或换行符}file.close();} else {std::cerr Unable to open file std::endl;}return 0;
}// getline 自定义分隔符号
int main () {std::string input apple,banana,orange,grape;std::istringstream stream(input);std::string token;while (std::getline(stream, token, ,)) {std::cout Extracted token: token std::endl; }
}使用场景二反序列化数据
TreeNode* deserialize(std::istringstream iss) {std::string val;iss val;if (val null) {return nullptr;}TreeNode* node new TreeNode(std::stoi(val));node-left deserialize(iss);node-right deserialize(iss);return node;
}
int main () {std::string data 1 2 null null 3 null null;std::istringstream iss(data);TreeNode* root deserialize(iss);std:: cout Deserialized tree root value: root-val std::endl;
}