常用代码。
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;