1

在调试时,我想在控制台上显示控制台输出并将备份保存在文件中。Windows 没有 tee,但您可以添加一个。假设文件夹是 c:\bin\ ,它工作正常。我已将其添加到系统的 PATH 中。

问题是设置 "[ ]| tee[.exe] output.txt" 或 "| tee[.exe] output.txt" 不起作用 - output.txt 无处可寻。我还尝试在调试和合并环境下的 VC 目录或环境中显式添加 c:\bin\ 路径为是。

"> output.txt" 工作正常。

任何人都知道我该如何解决这个问题?非常感谢!

4

2 回答 2

2

我假设您将| tee.exe output.txt字符串放在项目属性“调试|命令参数”中。

不幸的是,该属性仅支持重定向运算符,不支持管道运算符。如果您 | tee.exe output.txt在 preoperty 中有字符串并运行转储命令行参数的程序,您会看到该信息只是作为参数传递。“调试 | 命令参数”实际上并没有被成熟的 shell(例如cmd.exe)处理 - 它只是支持一些简单重定向的 IDE(实际上,它似乎支持的比我预期的要多):

来自http://msdn.microsoft.com/en-us/library/kcw4dzyf.aspx

You can use the following redirection operators in this box:

    < file
        Reads stdin from file.

    > file
        Writes stdout to file.

    >> file
        Appends stdout to file.

    2> file
        Writes stderr to file.

    2>> file
        Appends stderr to file.

    2> &1
        Sends stderr (2) output to same location as stdout (1).

    1> &2
        Sends stdout (1) output to same location as stderr (2).

>>通过使用命令将程序的输出重定向到文件并使用tail-f命令显示添加到文件中的任何内容,您可以获得所需内容的有限版本。如果你这样做,你可能会想要调用setvbuf( stdout, NULL, _IONBF, 0 )第一件事,main()以便 I/O 没有缓冲。否则tail -f在缓冲区被刷新之前不会看到它,我想你希望看到每个输出操作发生时。

另一种选择是将控制台窗口的“屏幕缓冲区高度”属性提高到一个很大的数字——当我得到一台新的 Windows 机器时,我做的第一件事就是将该值设置为 3000 左右——然后正常调试程序并复制/ 粘贴控制台窗口关闭前的内容。

于 2013-01-25T03:42:22.800 回答
0

您最好不要printf用于此目的。相反,编写自己的函数;采用格式化输入,如 printf - 具有可变数量的参数(...)。该函数将使用 printf 在控制台上显示,将缓冲区写入文件,将发送到输出到调试窗口等等。您可以根据调试/发布版本对其进行自定义。

它可能会像(可能有一些小错误):

void PrintDebuggingInfo(const char* pFormatString, ...) 
{    
    va_list  arguments;

    char OutputString[1024];

    va_start(pFormatString, argument);    
    vsprintf(OutputString,  pFormatString, argument); // Generate string

   // Now use `OutputString` as you wish! 
}

您可以使用vsprintf. 事实上,所有格式化函数都只使用这个函数!

于 2013-01-25T03:02:26.883 回答