如何从C运行外部程序并解析其输出?

时间:2020-03-05 18:47:26  来源:igfitidea点击:

我有一个实用程序,可以输出游戏所需的文件列表。如何在C程序中运行该实用程序并获取其输出,以便可以在同一程序中对其进行操作?

更新:呼吁缺乏信息。该实用程序吐出了一系列字符串,并且应该可以在Mac / Windows / Linux上完全移植。请注意,我正在寻找一种编程方式来执行该实用程序并保留其输出(将其输出到stdout)。

解决方案

回答

对于Unix类环境中的简单问题,请尝试使用popen()

从手册页:

The popen() function opens a process by creating a pipe, forking and invoking the shell.

如果我们使用读取模式,这正是我们所要求的。我不知道它是否在Windows中实现。

对于更复杂的问题,我们需要查找进程间通信。

回答

好吧,假设我们在Windows环境中使用命令行,则可以使用管道或者命令行重定向。例如,

commandThatOutputs.exe > someFileToStoreResults.txt

或者

commandThatOutputs.exe | yourProgramToProcessInput.exe

在程序中,我们可以使用C标准输入函数来读取其他程序的输出(scanf等):http://irc.essex.ac.uk/www.iota-six.co.uk/c/c1_standard_input_and_output .asp。我们也可以使用文件示例并使用fscanf。这在Unix / Linux中也应该起作用。

这是一个非常笼统的问题,我们可能需要包括更多详细信息,例如输出是什么类型(仅仅是文本还是二进制文件?)以及如何处理它。

编辑:万岁澄清!

重定向STDOUT看起来很麻烦,我必须在.NET中进行操作,这使我头疼不已。似乎正确的C方法是生成一个子进程,获取一个文件指针,突然间我的头很痛。

因此,这是使用临时文件的黑客。很简单,但是应该可以。如果速度不成问题(击打磁盘很慢)或者将其丢弃,这将很好地工作。如果要构建企业程序,则最好使用其他人的建议来研究STDOUT重定向。

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    FILE * fptr;                    // file holder
    char c;                         // char buffer

    system("dir >> temp.txt");      // call dir and put it's contents in a temp using redirects.
    fptr = fopen("temp.txt", "r");  // open said file for reading.
                                    // oh, and check for fptr being NULL.
    while(1){
        c = fgetc(fptr);
        if(c!= EOF)
            printf("%c", c);        // do what you need to.
        else
            break;                  // exit when you hit the end of the file.
    }
    fclose(fptr);                   // don't call this is fptr is NULL.  
    remove("temp.txt");             // clean up

    getchar();                      // stop so I can see if it worked.
}

确保检查文件权限:现在,这将简单地将文件与exe放在同一目录中。我们可能要考虑在nix中使用/ tmp,在Vista中使用C:\ Users \ username \ Local Settings \ Temp,或者在2K / XP中使用C:\ Documents and Settings \ username \ Local Settings \ Temp。我认为/ tmp可以在OSX中使用,但是我从未使用过。

回答

正如dmckee所指出的,在Linux和OS X中,popen()确实是最好的选择,因为这两个OS都支持该调用。在Windows中,这应该会有所帮助:http://msdn.microsoft.com/zh-cn/library/ms682499.aspx

回答

Windows上支持popen,请参见此处:

http://msdn.microsoft.com/zh-CN/library/96ayss4b.aspx

如果我们希望它是跨平台的,那么popen是可行的方法。

回答

MSDN文档说
如果在Windows程序中使用_popen函数,它将返回一个无效的文件指针,该指针将导致该程序无限期地停止响应。 _popen在控制台应用程序中正常工作。要创建重定向输入和输出的Windows应用程序,请参阅Windows SDK中的使用重定向的输入和输出创建子进程。