4

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

4

3 回答 3

6

在标准 C 中没有类似的东西,但通常,为了与 POSIX 兼容,编译器实现popen_popen在 VC++ 中),它启动一个命令(就像它会做的那样system)并将 a 返回FILE *到您要求的流(如果如果你想给程序一些输入,你想读取输出或标准输入)。

一旦你有了,你就可以用通常的/ /...FILE *来阅读它,就像你在普通文件上所做的那样。freadfscanf

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

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

于 2012-05-08T16:59:18.337 回答
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 ...//
//                                         //
于 2012-05-08T17:52:24.057 回答
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);
}
于 2012-06-16T03:24:35.927 回答