C++ - 标准库之 <sstream> ostringstream(ostringstream 概述、基本使用、清空内容、进阶使用)

发布于:2025-06-03 ⋅ 阅读:(27) ⋅ 点赞:(0)

一、std::ostringstream 概述

  1. std::ostringstream 是 C++ 标准库中的一个类,用于将数据格式化为字符串

  2. std::ostringstream 结合了流操作和字符串操作的功能,可以像使用 cout 一样向字符串写入数据


二、std::ostringstream 基本使用

  1. 构造与初始化
#include <iostream>
#include <sstream>

using namespace std;

int main() {

	// 默认构造(空字符串)
	ostringstream oss1;

	// 带初始字符串构造
	ostringstream oss2("init text");

	return 0;
}
  1. 写入数据与获取字符串
#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、清空内容的方式
  1. 赋空字符串
oss.str("");
  1. 构造空字符串
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、追加内容
  1. 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
  1. 使用 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、流状态
  1. 操作成功
#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
  1. 操作失败
#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

网站公告

今日签到

点亮在社区的每一天
去签到