2012-11-15 37 views
1

我有一个使用std :: cout打印到屏幕的C++程序。当程序作为服务运行时重定向std :: cout

有时我需要将它作为服务运行。当它作为Windows服务运行时,有什么方法可以看到cout输出吗?

重定向输出到一个文件或某种调试程序将是理想的。

显然,我可以用写入文件的函数替换cout,这可能是我要做的,但我很想知道是否有其他解决方案。

+1

在Unix系统上,您可以在启动进程时重定向标准输出,但在Windows中我并不熟悉这样的内容。可能它应该存在。 –

+0

启动过程或管道后重定向标准输出正是我所需要的。 – Meir

+0

尝试在Windows中对此功能进行一些研究。应该有这样的东西。我会谷歌的东西,如“在Windows中重定向输出过程”。 –

回答

2

基本上有无限的选择。最初的几个浮现在脑海:

围绕一个ostream参考

你可以绕过一个std :: ostream的参考:

void someFunc(std::ostream& out) { 
    //someFunc doesn't need to know whether out is a file, cout, or whatever 
    out << "hello world" << std::endl; 
} 

更换cout基础缓冲区与文件

来自cplusplus.com的示例:

streambuf *psbuf, *backup; 
ofstream filestr; 
filestr.open ("test.txt"); 

backup = cout.rdbuf();  // back up cout's streambuf 

psbuf = filestr.rdbuf(); // get file's streambuf 
cout.rdbuf(psbuf);   // assign streambuf to cout 

cout << "This is written to the file"; 

这里有一个带有freopen的单引号,但是我有一种爬行的感觉(并且this似乎在注释中重新强调它),它是未定义的行为,因为stdin和cout可以不同步。

freopen("/path/to/file", "r", stdout); 
//cout is now writing to path/to/file 

一个日志库

不是我头顶的一个很好的肯定,但你可以去完全展开,使用某种类型的日志库。 (还有的Windows事件,虽然这取决于你输出什么,那可能没有什么意义。)

管道

我怀疑这是可能的Windows服务,但如果是,总是有经典重定向:

blah.exe > C:\path\file 
1

简单的解决方案是SetStdHandle(STD_OUTPUT_HANDLE, your_new_handle)

相关问题