我有一个相对较旧的应用程序。通过一些小的更改,它几乎可以在Visual C ++ 2008中完美构建。我注意到的一件事是,我的“调试控制台”运行不正常。基本上,过去,我已经使用AllocConsole()过一个控制台,供调试输出使用。然后,我将使用freopen重定向stdout到它。这与C和C ++风格的IO完美配合。
现在,它似乎仅适用于C风格的IO。将类似的东西重定向cout到分配有控制台的正确方法是什么AllocConsole()?
这是曾经工作的代码:
if(AllocConsole()) {
freopen("CONOUT$", "wt", stdout);
SetConsoleTitle("Debug Console");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
}
编辑:发生在我身上的一件事是,我可以制作一个自定义streambuf,其溢出方法使用C风格的IO编写,并std::cout用它替换默认的流缓冲区。但这似乎是一个解决方案。有没有合适的方法在2008年做到这一点?还是MS忽略了这一点?
EDIT2:好的,所以我已经实现了上面阐述的想法。基本上看起来像这样:
class outbuf : public std::streambuf {
public:
outbuf() {
setp(0, 0);
}
virtual int_type overflow(int_type c = traits_type::eof()) {
return fputc(c, stdout) == EOF ? traits_type::eof() : c;
}
};
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
// create the console
if(AllocConsole()) {
freopen("CONOUT$", "w", stdout);
SetConsoleTitle("Debug Console");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED);
}
// set std::cout to use my custom streambuf
outbuf ob;
std::streambuf *sb = std::cout.rdbuf(&ob);
// do some work here
// make sure to restore the original so we don't get a crash on close!
std::cout.rdbuf(sb);
return 0;
}
有没有人比强迫std::cout别人变得更好/更清洁的解决方案fputc?
阿波罗的战车
Smart猫小萌
相关分类