为什么这个Windows命令行程序不能将其标准重定向到文件?

时间:2014-04-20 08:14:08

标签: c++ windows printf stdout

供参考,请参阅此小程序的源代码,EndPointController.exe: http://www.daveamenta.com/2011-05/programmatically-or-command-line-change-the-default-sound-playback-device-in-windows-7/

基本上,它是一个Visual Studio C ++程序,它使用printf函数将信息写入命令shell窗口。

以下是我在Windows 7 x64上运行程序的示例(使用上面链接中提供的编译二进制文件):

C:\Users\James\Desktop>EndPointController.exe
Audio Device 0: Speakers (High Definition Audio Device)
Audio Device 1: AMD HDMI Output (AMD High Definition Audio Device)
Audio Device 2: Digital Audio (S/PDIF) (High Definition Audio Device)
Audio Device 3: Digital Audio (S/PDIF) (High Definition Audio Device)

C:\Users\James\Desktop>

这完美无缺。现在,我将尝试将输出重定向到文件:

C:\Users\James\Desktop>EndPointController.exe > test.txt

C:\Users\James\Desktop>type test.txt

C:\Users\James\Desktop>

没用; test.txt是空的。这是权限问题吗?

C:\Users\James\Desktop>dir > test.txt

C:\Users\James\Desktop>type test.txt
 Volume in drive C has no label.
 Volume Serial Number is 16EC-AE63

 Directory of C:\Users\James\Desktop

04/20/2014  03:11 AM    <DIR>          .
04/20/2014  03:11 AM    <DIR>          ..
05/31/2011  06:16 PM             7,168 EndPointController.exe
04/20/2014  03:12 AM                 0 test.txt
               2 File(s)          7,168 bytes
               3 Dir(s)  171,347,292,160 bytes free

C:\Users\James\Desktop>

不,它似乎不是权限问题。任何人都可以解释这个printf函数是如何以某种方式绕过标准的重定向过程的吗?

2 个答案:

答案 0 :(得分:3)

当程序因某种原因退出时,似乎没有刷新输出缓冲区。

fflush(stdout);行之前添加return hr;为我修复了它。

我尝试了一些其他的东西,比如将宽字符串转换为narrow并将其传递给printf,使用wprintf,并将其编译为多字节并将字符串转换为narrow以传递给printf,但只能手动刷新缓冲区。

答案 1 :(得分:1)

我尝试从您包含的链接下载项目文件,然后运行已构建并包含在Release文件夹中的可执行文件,它按预期工作。我还在VC ++ 2013中重新构建了代码,它也按预期工作。

我怀疑操作员错误或某些系统问题 - 您问题中的信息似乎并不表示操作员错误;你提供的证据证明这不是一个案例。

我从C:\Users\<userprofile>\Documents\Visual Studio 2013\test\Release运行了代码。 Desktop是Windows中的“特殊”文件夹,可能有一些影响,但我对此表示怀疑。无论哪种方式,我认为这不是一个编程问题。