为什么我不能使用C#中的Process获得C ++程序的输出?

时间:2015-03-12 01:56:37

标签: c# c++ process redirectstandardoutput

我有一个C ++程序,它使用wprintf_s函数将结果打印到命令行。但是当我在C#中使用Process来读取程序的输出时,我无法得到它的任何字样。但是当我在fflush(stdout)语句后添加wprintf_s时,我终于可以在C#程序中读取标准输出。

我用来启动进度的代码是:

var proc = new Process {
    StartInfo = new ProcessStartInfo {
        FileName = "FILENAME",
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};
proc.Start();
StringCollection values = new StringCollection();

proc.OutputDataReceived += (s, args) => {
    lock (values) {
        values.Add(args.Data);
    }
};
proc.BeginOutputReadLine();
proc.WaitForExit();

有人可以告诉我为什么fflush(stdout)会起作用吗?

1 个答案:

答案 0 :(得分:3)

输出在C ++进程中被缓冲,并且将保持不变,直到缓冲区已满或刷新为止,例如,通过调用fflush(),关闭流或其他依赖于操作系统的原因。

fflush()只会导致输出缓冲区中的任何数据写入流。

如果您不想显式调用fflush(),可以考虑通过使用第二个参数的NULL指针调用setbuf()来在输出流上设置无缓冲模式:

#include <stdio.h>
#include <unistd.h>

int main()
{
    setbuf(stdout, (char *)NULL);

    while (1)
    {
        fputs("hi there\n", stdout);
        sleep(1);
    }
}

现在输出会立即出现。

请注意,如果stdout是终端,则不需要setbuf(f, NULL),因为这是终端设备的默认行为。如果stdout是管道,那么setbuf(f, NULL)将使其无缓冲。