1

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

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

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

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

4

3 回答 3

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,但我有一种令人毛骨悚然的感觉(似乎在评论中强化了它)这是未定义的行为,因为 stdin 和 cout 可以不同步。

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

一个日志库

不确定我的头上是否有一个好的,但你可以全力以赴并使用某种类型的日志库。(还有 Windows 事件,但取决于您输出的内容,这可能没有意义。)

管道

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

blah.exe > C:\path\file
于 2012-11-15T09:10:03.887 回答
1

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

于 2012-11-15T11:54:47.057 回答
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());
}
于 2019-03-06T03:40:34.350 回答