代码之家  ›  专栏  ›  技术社区  ›  Real Red.

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

  •  4
  • Real Red.  · 技术社区  · 16 年前

    我想从我的程序中运行一个DOS命令,例如“dir”命令。 我这样做就像,

    system("dir");
    

    是否有任何方法可以将该命令的输出直接读取到程序变量中?

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

    然后读取command.out文件。但是,我们如何才能直接执行它,而不是重定向到一个文件然后读取呢?

    5 回复  |  直到 12 年前
        1
  •  4
  •   sharptooth    16 年前

    您不能将它重定向到变量,但是您可以使用类似于Unix中管道如何用于链接命令的技巧。呼叫 CreateProcess() 并通过它 STARTUPINFO 具有相应设置的句柄和 STARTF_USESTDHANDLES 在里面 STARTUPINFO::dwFlags . 然后通过集合句柄读取来自生成进程的数据。

        2
  •  4
  •   qrdl    16 年前

    如果你的图书馆有 popen() posix函数,这就是您需要的。您可以从管道中读取命令输出,并以您喜欢的任何方式对其进行解析。

    FILE *dir;
    char direntry[80];
    
    dir = popen("dir", "r");
    while (!feof(dir)) {
        fgets(direntry, sizeof(direntry), dir);
        /* do something with direntry */
    }
    
        3
  •  4
  •   Real Red.    16 年前

    找到了另一种方法,或者更确切地说是与popen相当的windows。它是_popen()。这对我来说很合适,而且很容易使用。

       char   psBuffer[128];
       FILE   *pPipe;
    
       if( (pPipe = _popen( "dir", "rt" )) != NULL)
      {
         while(fgets(psBuffer, 128, pPipe))
         {
           printf(psBuffer);
         }
      }
    

    通过完整的示例查找详细信息 here .

        4
  •  1
  •   unwind    16 年前

    不能。程序在不同的内存空间中运行,因为它们是不同的进程。通常,在现代操作系统中,进程不共享内存。

    此外,很难在C中定义一个可以保存“dir”等命令输出的变量;需要动态增长才能腾出空间。

    最好的方法是使用 a pipe ,这将使从流中读取命令的输出成为可能,从中可以根据需要存储命令。

        5
  •  0
  •   Loki Astari    16 年前

    使用popen()它可以完全满足您的需要。
    它创建一个双向管道,分叉进程。在子级中,它将管道连接到Standard In和Standard Out,然后执行指定为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";
    }