调试时我想在控制台上显示控制台输出并在文件中保存备份。 Windows没有tee,但您可以添加一个。假设该文件夹是c:\ bin \,它工作正常。我已将其添加到系统的PATH中。
问题是设置“[] | tee [.exe] output.txt”或“| tee [.exe] output.txt”将无效 - output.txt无处可寻。我还尝试在调试和合并环境下的VC目录或环境中显式添加c:\ bin \ path为是。
“> output.txt”工作正常。
任何人都知道如何解决这个问题?非常感谢!
答案 0 :(得分:1)
我假设您将| tee.exe output.txt
字符串放在项目属性“Debugging | Command Argument”中。
不幸的是,该属性仅支持重定向运算符,而不支持管道运算符。如果您在preoperty中有| tee.exe output.txt
字符串并运行一个转储命令行参数的程序,您将看到该信息仅作为参数传递。 “Debugging | Command Argument”实际上并没有被一个成熟的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左右 - 然后调试程序通常在关闭之前复制/粘贴控制台窗口的内容。
答案 1 :(得分: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
的其他变体。事实上,所有格式化函数都只使用此函数!