如何读取/重定向dos命令的输出到C / C ++中的程序变量?

时间:2009-09-10 09:03:56

标签: c++ c command

我想从我的程序中运行dos命令,例如“dir”命令。 我这样做,

system("dir");

有没有办法直接将该命令的输出读入程序变量?

我们总是可以将输出重定向到文件,然后通过执行来读取该文件 system("dir > command.out");

然后阅读command.out文件。但是我们怎样才能直接做到而不是重定向到文件然后阅读呢?

5 个答案:

答案 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";
}