我想从我的程序中运行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";
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top