为什么我不能在 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()
、关闭流或其他 OS 相关原因。
fflush()
只会将输出缓冲区中的任何数据写入流。
如果您不想显式调用 fflush()
,您可以考虑在输出流上设置无缓冲模式,方法是调用 setbuf()
,第二个参数为 NULL 指针:
#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)
将使其无缓冲。
我有一个 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()
、关闭流或其他 OS 相关原因。
fflush()
只会将输出缓冲区中的任何数据写入流。
如果您不想显式调用 fflush()
,您可以考虑在输出流上设置无缓冲模式,方法是调用 setbuf()
,第二个参数为 NULL 指针:
#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)
将使其无缓冲。