UI程序的std::cout重定向输出到Visual Studio的debug输出窗口

发布于:2025-03-15 ⋅ 阅读:(16) ⋅ 点赞:(0)

常用代码。
UI程序的std::cout重定向输出到Visual Studio的debug输出窗口

#include <iostream>
#include <streambuf>
#include <vector>
#include <string>
#include <afxwin.h> //MFC

// 自定义 streambuf 类,用于重定向输出到 Visual Studio 的输出窗口
class OutputDebugStreamBuf : public std::streambuf {
public:
	OutputDebugStreamBuf() : buffer(256) {
		setp(buffer.data(), buffer.data() + buffer.size() - 1);
	}

	~OutputDebugStreamBuf() {
		sync();
	}

protected:
	// 重写 overflow 方法,处理缓冲区溢出
	int_type overflow(int_type c) override {
		if (c != traits_type::eof()) {
			*pptr() = c;
			pbump(1);
			if (sync() != 0) {
				return traits_type::eof();
			}
		}
		return c;
	}

	// 重写 sync 方法,将缓冲区内容输出到 Visual Studio 的输出窗口
	int sync() override {
		if (pbase() != pptr()) {
			std::string output(pbase(), pptr() - pbase());
			OutputDebugStringA(output.c_str()); // 使用 OutputDebugStringA 输出
			setp(buffer.data(), buffer.data() + buffer.size() - 1); // 重置缓冲区
		}
		return 0;
	}

private:
	std::vector<char> buffer; // 缓冲区
};

// 管理 std::cout 重定向的类
class CoutRedirector {
public:
	CoutRedirector() {
		// 保存原始的 std::cout 缓冲区
		original_cout_buffer = std::cout.rdbuf();
		// 重定向 std::cout 到自定义的 streambuf
		std::cout.rdbuf(&debugStreamBuf);
	}

	~CoutRedirector() {
		// 恢复原始的 std::cout 缓冲区
		if (original_cout_buffer) {
			std::cout.rdbuf(original_cout_buffer);
		}
	}

private:
	OutputDebugStreamBuf debugStreamBuf; // 自定义的 streambuf
	std::streambuf* original_cout_buffer = nullptr; // 保存原始的 std::cout 缓冲区
};

// 全局变量,用于管理 std::cout 的重定向
CoutRedirector g_CoutRedirector;

网站公告

今日签到

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