我想从我的程序中运行dos命令,例如“dir”命令。 我这样做,
system("dir");
有没有办法直接将该命令的输出读入程序变量?
我们总是可以将输出重定向到文件,然后通过执行来读取该文件
system("dir > command.out");
然后阅读command.out文件。但是我们怎样才能直接做到而不是重定向到文件然后阅读呢?
答案 0 :(得分:4)
您无法将其重定向到变量,但您可以执行类似于在Unix中使用管道链接命令的技巧。致电CreateProcess()
,并在STARTUPINFO
中通过相应的设置句柄和STARTF_USESTDHANDLES
向其传递STARTUPINFO::dwFlags
个实例。然后通过set handle读取来自生成进程的数据。
答案 1 :(得分:4)
如果你的图书馆有popen()
POSIX功能,那就是你需要的。您可以从管道读取命令输出并以您喜欢的方式解析它。
FILE *dir;
char direntry[80];
dir = popen("dir", "r");
while (!feof(dir)) {
fgets(direntry, sizeof(direntry), dir);
/* do something with direntry */
}
答案 2 :(得分:4)
找到一种替代方式或者说相当于popen的窗户。它是_popen()。这适用于我,而且它易于使用。
char psBuffer[128];
FILE *pPipe;
if( (pPipe = _popen( "dir", "rt" )) != NULL)
{
while(fgets(psBuffer, 128, pPipe))
{
printf(psBuffer);
}
}
使用完整示例here查找详细信息。
答案 3 :(得分:1)
你做不到。程序在不同的内存空间中运行,因为它们是不同的进程。通常,在现代操作系统中,进程不共享内存。
此外,很难在C中定义一个可以保存命令输出的变量,例如“dir”;它需要动态增长以腾出空间。
最好的方法是使用a pipe,这样就可以从流中读取命令的输出,您可以根据需要存储它。
答案 4 :(得分:0)
使用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";
}