繁体   English   中英

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

[英]Why can't I get the output of a C++ program using Process in C#?

我有一个C ++程序,它使用wprintf_s函数将结果打印到命令行。 但是当我在C#中使用Process来读取程序的输出时,我无法得到它的任何说法。 但是当我在wprintf_s语句之后添加了一个fflush(stdout) ,我终于可以在我的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)会起作用?

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

fflush()只是将输出缓冲区中的任何数据写入流中。

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

#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)将使它无缓冲。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM