当程序作为服务运行时重定向std :: cout

时间:2012-11-15 09:07:40

标签: c++ windows cout

我有一个c ++程序,使用std :: cout打印到屏幕上。

有时我需要将其作为服务运行。当它作为Windows服务运行时,有没有办法看到cout输出?

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

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

3 个答案:

答案 0 :(得分: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的1-liner,但我有一种匍匐的感觉(并且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 :(得分:1)

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

答案 2 :(得分:0)

您可以执行以下操作:

class MyTerminal {
    std::stringstream terminalText;
}

class MyWindow {
public:
     void OnUpdate();
protected:
CTextbox m_textbox;
MyTerminal m_terminal;
}

void MyWindow::OnUpdate()
{
    m_textBox.setText(m_terminal.terminalText.str());
    m_terminal.terminalText.str(std::string());
}