为什么我无法使用 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()
来在输出流上设置无缓冲模式:
#include <stdio.h>
#include <unistd.h>
int main()
{
setbuf(stdout, (char *)NULL);
while (1)
{
fputs("hi theren", stdout);
sleep(1);
}
}
现在输出将立即出现。
请注意,如果stdout
是终端,则不需要setbuf(f, NULL)
,因为这是终端设备的默认行为。如果stdout
是管道,则setbuf(f, NULL)
将使其无缓冲。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 使用指针从C++中的数组中获取最大值
- 如何获取std::result_of函数的返回类型
- 如何在openssl-ecc中获取十六进制格式的私钥
- 使用Unreal C++获取VR耳机的世界位置/方向
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 从C字符串中获取奇怪的字符串长度
- 为什么我的for循环不能正确获取argv
- 从python中调用C++函数并获取返回值
- 如何获取一个数字的前3位
- 获取字符串的长度并将其分配给数组
- 无法获取菜单选择以运行函数.C++
- 数组长度,为什么从命令行获取时不能使用它?
- Boost Spirit,获取迭代器内部语义动作
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 具有默认值的引用获取函数
- xmake总是报告:错误:无法获取cxx的程序,为什么
- 在c++中获取大文件的大小