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

Posted

技术标签:

【中文标题】如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?【英文标题】:How to read/redirect output of a dos command to a program variable in C/C++? 【发布时间】:2010-11-27 02:42:52 【问题描述】:

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

system("dir");

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

我们总是可以将输出重定向到一个文件,然后读取该文件,方法是system("dir > command.out");

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

【问题讨论】:

我希望您真的在运行其他命令,而不是“dir”,因为有更好的方法可以从 C 或 C++ 中获取目录列表。 是的,dir 只是为了举例。实际上我正在运行另一个命令行应用程序,然后尝试读取它的输出。我无法控制/访问该应用程序的代码,否则我会重用该代码本身。 【参考方案1】:

你不能将它重定向到一个变量,但你可以做一个类似于 Unix 中使用管道链接命令的技巧。调用CreateProcess(),并将STARTUPINFO 实例传递给它,并相应地设置句柄和STARTUPINFO::dwFlags 中的STARTF_USESTDHANDLES。然后通过设置的句柄读取来自衍生进程的数据。

【讨论】:

【参考方案2】:

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

FILE *dir;
char direntry[80];

dir = popen("dir", "r");
while (!feof(dir)) 
    fgets(direntry, sizeof(direntry), dir);
    /* do something with direntry */

【讨论】:

这仅适用于 unix 系统,对吗?我的意思是 popen() 不是标准 c/c++ 的一部分。我怀疑等效的库是否可以在 windows 上使用 popen()。 是POSIX函数。有适用于 Windows 的 POSIX 堆栈 - en.wikipedia.org/wiki/Posix#POSIX_for_Windows【参考方案3】:

找到了一种替代方式,或者说是 windows 等效于 popen。它是_popen()。这对我来说很合适,而且很容易使用。

   char   psBuffer[128];
   FILE   *pPipe;

   if( (pPipe = _popen( "dir", "rt" )) != NULL)
  
     while(fgets(psBuffer, 128, pPipe))
     
       printf(psBuffer);
     
  

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

【讨论】:

这很好用而且很容易使用。因此,选择它作为答案。【参考方案4】:

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

此外,在 C 中定义一个变量来保存命令的输出(例如“dir”)是很困难的;它需要动态增长以腾出空间。

最好的方法是使用a pipe,这样就可以从流中读取命令的输出,您可以根据需要存储它。

【讨论】:

【参考方案5】:

使用 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";

【讨论】:

以上是关于如何将 dos 命令的输出读取/重定向到 C/C++ 中的程序变量?的主要内容,如果未能解决你的问题,请参考以下文章

shell 12输入输出重定向

Shell 输入/输出重定向

Shell 输入/输出重定向

有关shell输出重定向问题

shell--10Shell 输入/输出重定向

如何将标准输入重定向到 Windows 命令行中的文件?