在C中提取dos命令输出

时间:2012-05-08 16:52:36

标签: c system exec dos

使用system()exec(),我可以执行任何命令,但会将结果显示在控制台中。我想执行命令并提取输出并处理它,然后显示它。如何在Windows / DOS平台上实现这一目标?

3 个答案:

答案 0 :(得分:6)

在标准C中没有类似的东西,但通常,为了与POSIX兼容,编译器实现popen(VC ++中的_popen),它启动一个命令(就像{{1}一样})并将system返回到您要求的流(如果您想要读取输出 stdin,则可以请求stdout,如果您想为程序提供一些输入)。

获得FILE *后,您可以使用通常的FILE * / fread / ...阅读,就像您在常规文件中所做的那样。

如果你想同时拥有输入和输出重定向的东西开始变得有点复杂,因为Windows编译器通常确实有类似POSIX fscanf的东西,但它并不完美兼容(主要是因为Windows进程创建模型不同)。

在这种情况下(并且在任何情况下,您需要对启动过程进行更多控制而不是普通pipe给出的)我会简单地使用“真实”方式在Windows上执行IO重定向,即使用CreateProcess和适当的选项;见例如here

答案 1 :(得分:2)

Matteo Italia的答案很棒。但是有些编译器(尤其是旧编译器)不支持popen()

如果不支持popen(),这是一个可能的解决方案。

在DOS中,我们可以使用>将输出重定向到临时文件。

例如:

C:\> ipconfig > temp.txt

然后我可以在 C 代码中打开 temp.txt ,然后重新处理其内容。

我的 C 代码类似于:

system("ipconfig > temp.txt");
FILE *fp;
fp = fopen("temp.txt","r");
//                                         //
//... Code for reprocessing can go here ...//
//                                         //

答案 2 :(得分:1)

对于那些没有popen的人来说,这是一个替代答案,应该适用于大多数系统。此代码不是线程安全的。我希望这对大多数情况来说不是一个重要的限制。

#include <stdio.h>
#include <process.h>
#include <io.h>
#include <sys\stat.h>
#include <assert.h>

int main()
{
    int so = dup(1);
    close(1);
    int i = creat("output.txt", S_IWRITE);
    assert(i == 1); // i should be 1...
    system("dir");
    close(i);
    dup2(so, 1);
    close(so);
}