std::stringstream
是 C++ 标准库中的一个类,位于 <sstream>
头文件中。它提供了一种在内存中操作字符串的方式,类似于文件流的操作。std::stringstream
继承自 std::iostream
,因此它具有输入流 (std::istream
) 和输出流 (std::ostream
) 的功能。
原理
std::stringstream
基于 std::stringbuf
这个缓冲区类。std::stringbuf
维护一个内部的 std::string
对象,所有的读写操作都在这个 std::string
上进行。这使得 std::stringstream
可以像文件流一样使用,但操作的对象是内存中的字符串。
使用方法
以下是 std::stringstream
的一些常见用法:
1. 创建 std::stringstream
对象
#include <sstream>
#include <iostream>
int main() {
std::stringstream ss;
}
2. 写入数据
#include <sstream>
#include <iostream>
int main() {
std::stringstream ss;
ss << "Hello, ";
ss << "world!";
std::cout << ss.str() << std::endl; // 输出: Hello, world!
}
3. 读取数据
#include <sstream>
#include <iostream>
int main() {
std::stringstream ss("123 456 789");
int a, b, c;
ss >> a >> b >> c;
std::cout << a << " " << b << " " << c << std::endl; // 输出: 123 456 789
}
4. 清空和重用 std::stringstream
#include <sstream>
#include <iostream>
int main() {
std::stringstream ss;
ss << "Hello";
std::cout << ss.str() << std::endl; // 输出: Hello
ss.str(""); // 清空字符串流
ss.clear(); // 清除状态标志
ss << "World";
std::cout << ss.str() << std::endl; // 输出: World
}
注意
在读取或者写入之前,可以通过ss.str(std::string())或ss.str("")来清空stringstream中的内容。
#include <sstream>
#include <iostream>
int main() {
std::stringstream ss;
ss << "Hello";
std::cout << ss.str() << std::endl; // 输出: Hello
ss.str(""); // 清空字符串流
//ss.clear(); // 清除状态标志
ss << "World";
std::cout << ss.str() << std::endl; // 输出: Hello
// World
}
clear()函数
std::stringstream
的 clear()
函数用于重置流的状态标志,使得流可以重新用于读取或写入操作。状态标志包括 std::ios::goodbit
, std::ios::eofbit
, std::ios::failbit
, 和 std::ios::badbit
,它们表示流的不同状态。
当一个读取或写入操作失败时(例如尝试从空流中读取数据,或者读取的数据与预期类型不符),流会设置相应的状态标志,如 failbit
或 badbit
。一旦设置了这些标志,流就不能再进行进一步的读写操作,除非清除这些标志。
下面是一个使用 std::stringstream
的 clear()
函数的例子:
#include <iostream>
#include <sstream>
#include <string>
int main() {
std::stringstream ss;
int number;
// 假设我们有一个不正确的输入,这将导致设置 failbit
ss.str("abc");
ss >> number; // 这里会失败,因为 "abc" 不能转换成 int
// 在进行下一个读取之前,我们需要清除状态标志
if (ss.fail()) {
std::cout << "读取发生错误,清除状态标志并继续。\n";
ss.clear(); // 重置流的状态标志
}
// 现在我们可以重新使用 stringstream 了
ss.str("123"); // 设置新的字符串
ss >> number; // 这次转换会成功
std::cout << "读取的数字是: " << number << std::endl;
return 0;
}
在这个例子中,我们首先尝试从 stringstream
中读取一个整数,但是由于流中的字符串是 “abc”,所以读取失败并且设置了 failbit
。在尝试下一个操作之前,我们调用了 clear()
来重置状态标志。这样我们就可以重新设置流中的字符串并再次尝试读取,这次读取操作成功读取了数字 123。