为什么可以';t我得到一个C++;C#中使用进程的程序? 我有一个C++程序,使用 WPROTFFS 函数将结果打印到命令行中。但是,当我在C#中使用Process读取程序的输出时,我无法得到任何单词。但是,当我在wprintf\u s语句之后添加fflush(stdout)时,我终于可以在我的C程序中读取标准输出了

为什么可以';t我得到一个C++;C#中使用进程的程序? 我有一个C++程序,使用 WPROTFFS 函数将结果打印到命令行中。但是,当我在C#中使用Process读取程序的输出时,我无法得到任何单词。但是,当我在wprintf\u s语句之后添加fflush(stdout)时,我终于可以在我的C程序中读取标准输出了,c#,c++,process,redirectstandardoutput,C#,C++,Process,Redirectstandardoutput,我用于启动进度的代码是: var proc = new Process { StartInfo = new ProcessStartInfo { FileName = "FILENAME", UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true } }; proc.Start(); StringCollection

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

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();

有人能告诉我为什么<代码> FLUHU(STDUT)< /C>会工作吗?< /P> < P>输出在C++进程中被缓冲,并将一直保留到缓冲区满或被刷新,例如通过调用“代码> FFLUHSUMER”< /COD>,通过关闭流或其他OS依赖的原因。

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

如果您不想显式调用<代码> FFLUHSUMER()/CUT>,可以考虑在输出流上设置非缓冲模式,第二个参数用null指针调用:

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

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

    while (1)
    {
        fputs("hi there\n", stdout);
        sleep(1);
    }
}
#包括
#包括
int main()
{
setbuf(标准输出,(字符*)NULL);
而(1)
{
fputs(“hi there\n”,stdout);
睡眠(1);
}
}
现在,输出将立即显示


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

因为它正在被缓冲。@OldProgrammer如果没有
fflush
,输出将始终在缓冲区中?我在运行Perl脚本时遇到过类似的问题,脚本完成后,它缓冲了stdout,然后立即将所有内容刷新到我的C#app中。谢谢您的解释。我想知道,每当我使用
Process
启动命令行程序并重定向输出流时,程序的
stdout
是否会是一个管道?通过“管道”,我指的是一个进程的输出连接到另一个进程的输入的概念。无论如何,缓冲发生在子进程中,因此禁用子进程中的缓冲可以解决问题。重定向可能是通过管道实现的,但我对.NET还不够精通,不能肯定这一点。