当前位置:  开发笔记 > 运维 > 正文

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

如何解决《如何从C运行外部程序并解析其输出?》经验,为你挑选了4个好方法。

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

更新:很好地呼吁缺乏信息.该实用程序吐出一系列字符串,这应该是完全可移植的Mac/Windows/Linux.请注意,我正在寻找一种程序化的方法来执行该实用程序并保留其输出(转到stdout).



1> MestreLion..:

正如其他人所指出的那样,popen()是最标准的方式.由于没有回答提供了使用此方法的示例,因此在这里:

#include 

#define BUFSIZE 128

int parse_output(void) {
    char *cmd = "ls -l";    

    char buf[BUFSIZE];
    FILE *fp;

    if ((fp = popen(cmd, "r")) == NULL) {
        printf("Error opening pipe!\n");
        return -1;
    }

    while (fgets(buf, BUFSIZE, fp) != NULL) {
        // Do whatever you want here...
        printf("OUTPUT: %s", buf);
    }

    if(pclose(fp))  {
        printf("Command not found or exited with error status\n");
        return -1;
    }

    return 0;
}


@CoolGuy:取决于你想要什么.`pclose()`如果获取命令的退出状态时出错,则返回`-1`,否则返回退出状态本身.由于命令传统上将退出状态设置为"0"以表示成功,通过检查`if(pclose(fp))`我们正在测试`pclose()`或命令中的错误.

2> dmckee..:

对于Unix-ish环境中的简单问题,请尝试popen().

从手册页:

popen()函数通过创建管道,分叉和调用shell来打开一个进程.

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

对于更复杂的问题,您希望查找进程间通信.


一些如何正确使用`popen()`的例子会很好.
[Thi的回答](http://stackoverflow.com/a/53372/119527)表示Windows上可以使用`popen`。

3> Adam Pierce..:

Windows支持popen,请看:

http://msdn.microsoft.com/en-us/library/96ayss4b.aspx

如果您希望它是跨平台的,那么popen就是您的选择.



4> David J. Sok..:

好吧,假设您在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 
#include 

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相同的目录中.您可能希望了解/tmp在nix中使用,或C:\Users\username\Local Settings\Temp在Vista中使用或C:\Documents and Settings\username\Local Settings\Temp in 2K/XP.我认为/tmp它将在OSX中运行,但我从未使用过.

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有