如何读取/重定向dos命令的输出到C / C ++中的程序变量?
题
我想从我的程序中运行dos命令,例如“dir”;命令。 我这样做,
system("dir");
有没有办法直接将该命令的输出读入程序变量?
我们总是可以将输出重定向到文件,然后通过执行
来读取该文件
system(" dir> command.out");
然后阅读command.out文件。但是我们怎样才能直接做到而不是重定向到文件然后阅读呢?
解决方案 3
找到一种替代方式或者说相当于popen的窗户。它是_popen()。这适用于我,而且它易于使用。
char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "dir", "rt" )) != NULL)
{
while(fgets(psBuffer, 128, pPipe))
{
printf(psBuffer);
}
}
使用完整示例查找详细信息此处
其他提示
您无法将其重定向到变量,但您可以执行类似于在Unix中使用管道链接命令的技巧。致电 CreateProcess()
,并在 STARTUPINFO :: dwFlags
中通过相应的设置句柄和 STARTF_USESTDHANDLES
传递 STARTUPINFO
实例。然后通过set handle读取来自生成进程的数据。
如果您的库具有 popen()
POSIX功能,那就是您所需要的。您可以从管道读取命令输出并以您喜欢的方式解析它。
FILE *dir;
char direntry[80];
dir = popen("dir", "r");
while (!feof(dir)) {
fgets(direntry, sizeof(direntry), dir);
/* do something with direntry */
}
你做不到。程序在不同的内存空间中运行,因为它们是不同的进程。通常,在现代操作系统中,进程不共享内存。
此外,很难在C中定义一个可以保存命令输出的变量,例如“dir”;它需要动态增长以腾出空间。
最好的方法是使用管道,这样就可以从流中读取命令的输出,您可以根据需要存储它。
使用popen()它完全符合您的要求。
它创建了一个双向管道,分叉进程。在子节点中,然后将管道连接到标准输入和标准输出,然后将指定为第一个参数的命令执行到popen()。
#include <stdio.h>
#include <string>
#include <iostream>
int main()
{
std::string output;
FILE* data = popen("cat PLOP","r");
for(char c = getc(data);c != EOF;c = getc(data))
{
output += c;
}
pclose(data);
std::cout << "Data(" << output << ")\n";
}
不隶属于 StackOverflow