4 - 字符串流sstream
在<sstream>
头文件中定义了输入和输出字符串流。其中,std::ostringstream
类将数据写入字符串,std::istringstream
类从字符串读出数据,std::stringstream
则综合两者功能。
字符串流
初始化
在使用字符串流前,需要绑定一个string
对象,可以在初始化的时候进行绑定操作:
string str {"1234"};
istringstream ist(str);
.str()方法
字符串流的.str()
成员方法有两种重载:
.str()
:返回字符串流所保存的string
对象的拷贝.str(x)
:将字符串对象x
拷贝到字符串流中,返回void
接下来,康康我们该如何使用字符串流对象。
使用
转换数据类型
字符串流可以对数据类型进行转化,例如string
转换为int
:
// String -> int, 使用istringstream
string str{ "d123" };
istringstream iss(str);
int i = 0;
iss >> i;
if (iss.bad())
{
throw runtime_error("istringstream is corrupted");
}
else if (iss.fail())
{
iss.clear();
iss.ignore(numeric_limits<streamsize>::max(), '\n');
cerr << "String format error!" << endl;
}
else
{
cout << i << endl;
}
以及int
转换为string
:
// int -> string, 使用ostringstream
int srcI{ 100 };
ostringstream oss;
oss << srcI << endl;
if (oss.bad())
{
throw runtime_error("ostringstream is corrupted");
}
else
{
cout << oss.str() << endl;
}
处理字符串
使用字符串流可以高效处理字符串对象,例如切分空格分隔的字符串:
string input{ "1 2 3 4 5" };
string output;
stringstream ss(input);
while (ss >> output)
{
cout << output << endl;
}
if (ss.bad())
{
throw runtime_error("stringstream is corrupted");
}
总结
相对于标准C++字符串,字符串流的主要优点是除了数据之外,这个对象还知道从哪里进行下一次读/写操作;并且支持操作算子和本地化,格式化功能更加强大;如果需要通过连接几个较小字符串来构建一个字符串,字符串流更高效。
参考资料
- 飘零的落花 - 现代C++详解
- C++20高级编程