一、std::ostringstream
概述
std::ostringstream
是 C++ 标准库中的一个类,用于将数据格式化为字符串
std::ostringstream
结合了流操作和字符串操作的功能,可以像使用 cout 一样向字符串写入数据
二、std::ostringstream
基本使用
- 构造与初始化
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss1;
ostringstream oss2("init text");
return 0;
}
- 写入数据与获取字符串
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss << "Hello" << " " << 42 << " " << 3.14;
string result = oss.str();
cout << result << endl;
oss.str("");
return 0;
}
# 输出结果
Hello 42 3.14
三、std::ostringstream
清空内容
1、如果不清空内容
- 如果不清空内容,
std::ostringstream
会保留之前写入的所有内容,后续写入会追加到已有内容之后
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss << "Hello" << " World";
string result1 = oss.str();
cout << result1 << endl;
string result2 = oss.str();
cout << result2 << endl;
return 0;
}
# 输出结果
Hello World
Hello World
2、清空内容的方式
- 赋空字符串
oss.str("");
- 构造空字符串
oss.str(string());
四、std::ostringstream
进阶使用
1、格式化控制
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss << hex << 255;
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
ff
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main() {
ostringstream oss;
oss << setw(10) << "text";
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
text
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main() {
ostringstream oss;
oss << setfill('*') << setw(8) << 42;
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
******42
#include <iostream>
#include <sstream>
#include <iomanip>
using namespace std;
int main() {
ostringstream oss;
oss << fixed << setprecision(2) << 3.14159;
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
3.14
2、追加内容
- str 方法用于完全替换流中的内容,且流的位置指针会被重置到开头,如果直接追加内容,追加内容会覆盖掉替换内容
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss.str("New content");
oss << " appended";
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
appendednt
- 使用 seekp 方法定位到行末,再追加内容
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss.str("New content");
oss.seekp(0, ios::end);
oss << " appended";
string result = oss.str();
oss.str("");
cout << result << endl;
return 0;
}
# 输出结果
New content appended
3、流状态
- 操作成功
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss << "Hello";
if (oss.good()) {
cout << "操作成功" << endl;
}
if (oss.fail()) {
cout << "操作失败" << endl;
}
cout << "内容:" << oss.str() << endl;
return 0;
}
# 输出结果
操作成功
内容:Hello
- 操作失败
#include <iostream>
#include <sstream>
using namespace std;
int main() {
ostringstream oss;
oss << "Hello";
oss.setstate(ios::failbit);
oss << "Hello World";
if (oss.good()) {
cout << "操作成功" << endl;
}
if (oss.fail()) {
cout << "操作失败" << endl;
}
cout << "内容:" << oss.str() << endl;
return 0;
}
# 输出结果
操作失败
内容:Hello