gpt4 book ai didi

c++ - 在不写入 C/C++ 文件的情况下捕获系统调用标准输出

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:33 25 4
gpt4 key购买 nike

我想将系统调用的标准输出读入 C/C++ 字符串。我可以在不使用临时文件的情况下执行此操作吗?

Perl

//without file io
$output = `echo hello`;

C++

//with file io
system ("echo hello > tmp");
std::fstream file ("tmp");
std::string s;
file >> s;

最佳答案

使用 C 的 popen (可能是最简单的解决方案,即使它不使用 C++ 的 iostream):

FILE *p = popen("echo hello", "r");
std::string s;
for (size_t count; (count = fread(buf, 1, sizeof(buf), p));)
s += string(buf, buf + count);
pclose(p);

假设您的 iostream 具有非标准的 xfstream::xfstream(int fd) 构造函数:

FILE *p = popen("echo hello", "r");
std::ifstream p2(fileno(p));
std::string s;
p2 >> s;
p2.close();
pclose(p);

使用 Boost.Iostreams ,您不必依赖于 iostream 的非标准扩展:

boost::iostreams::file_descriptor_source p2(fileno(p));

不幸的是,Windows 太糟糕了而且 _popen仅适用于控制台应用程序;对于图形应用程序:

SECURITY_ATTRIBUTES sec;
sec.nLength = sizeof(sec);
sec.bInheritHandle = TRUE;
sec.lpSecurityDescriptor = NULL;
HANDLE *h[2];
CreatePipe(&h[0], &h[1], &sec, 0);
SetHandleInformation(h[0], HANDLE_FLAG_INHERIT, 0)
STARTUPINFO si;
memset((void *)&si, 0, sizeof(si));
si.hStdInput = INVALID_HANDLE_VALUE;
si.hStdOutput = h[1];
si.hStdError = INVALUD_HANDLE_VALUE;
si.dwFlags |= STARTF_USESTDHANDLES;
CreateProcess(NULL, "cmd /c \"echo hello\"", NULL, NULL, TRUE, 0, NULL, NULL, &si, NULL);
boost::iostreams::file_descriptor_source p(h[0]);

(完全未经测试)

关于c++ - 在不写入 C/C++ 文件的情况下捕获系统调用标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1103047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com