【问题标题】:Write console output to .txt AND show it on console将控制台输出写入 .txt 并在控制台上显示
【发布时间】:2018-08-12 18:32:14
【问题描述】:

我最近发现,您可以使用 Visual Studio 将 C++ 程序的控制台输出保存到文本文件中(在项目属性的命令参数中添加“> output.txt”)。

问题是我希望输出同时显示在我创建的输出文件和命令控制台中,以便于调试(一旦将输出保存到文件中,它就不会再显示在控制台上)。是否有任何选项可以在 Visual Studio 或类似功能中启用这两个功能?

【问题讨论】:

  • 看看tee做了什么。
  • 最好的办法是编写一个小型记录器,它可以同时写入cout 和要保存输出的文件。
  • 由于我已经有一个相当大的代码,我希望不必进一步更改它,这就是为什么我正在寻找 VS 替代品的原因。
  • Boost::IOStreams 是一个选项吗?您可以将cout 重定向到自定义流写入器(即接收器),该写入器同时写入文件和控制台。
  • 在您可能需要弄清楚如何在 Microsoft Windows 上执行此操作的时候,您可能能够学习 Linux,这个问题在大约 30 年前就已经解决了。跨度>

标签: c++ visual-studio console output prompt


【解决方案1】:

您可以使用自定义流实现在输出时将数据发送到多个目的地。这些很容易通过创建合适的流缓冲区来创建。例如:

#include <fstream>
#include <iostream>
#include <ostream>
#include <streambuf>

class teebuf
    : public std::streambuf {
    std::streambuf* d_sbuf1;
    std::streambuf* d_sbuf2;
public:
    teebuf(std::streambuf* sbuf1, std::streambuf* sbuf2)
        : d_sbuf1(sbuf1), d_sbuf2(sbuf2) {
    }
    int overflow(int c) {
        if (c != std::char_traits<char>::eof()) {
            this->d_sbuf1->sputc(c);
            this->d_sbuf2->sputc(c);
        }
        return std::char_traits<char>::not_eof(c);
    }
};

int main() {
    std::ofstream   out("foo.txt");
    teebuf          tb{out.rdbuf(), std::cout.rdbuf()};
    std::streambuf* coutbuf = std::cout.rdbuf(&tb);
    std::cout << "hello world! (to both the console and the file)\n";

    std::cout.rdbuf(coutbuf); // needs to be replaced as it gets used to flush
}

当然,这是一种侵入式方法,需要更改源。我不使用 MSVC++,也无法评论是否有将标准输出保存到文件的方法。

【讨论】:

    【解决方案2】:

    您可以通过使用命令tee来实现此目的

    假设您有一个名为 myExe 的可执行文件(不管它是否用 C++ 实现),您可以执行以下操作:

    ./myExec | tee output.txt
    

    如果您想在 Visual Studio 中实现此目的,请将 &gt; output.txt 更改为以下内容之一

    1.在 Linux 上工作:

    | tee output.txt

    2。在 Windows 上工作:

    &gt; output.txt &amp;&amp; type output.txt

    【讨论】:

    • 不使用 VS,这是 OP 所要求的。
    • 我更新了我的答案,请再次查看@Bruno Demantova,感谢您的警告 Neil Bluetterworth
    • 这在 Windows 上不起作用。您最终没有输出到控制台,因为它已被重定向到当前工作目录中名为 type 的文件。您的新 linux 指令也值得怀疑,因为通常您会使用 | 而不是 &gt; 将输出通过管道传输到 tee。
    • 是的,你是对的。我更新了我的答案,但不确定 Windows 版本是否有效,因为我目前无法在 Windows 上对其进行测试。谢谢@RetiredNinja
    • PowerShell 支持 tee BTW。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2017-09-30
    • 2020-04-10
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    相关资源
    最近更新 更多