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高级编程