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

如何从C运行外部程序并解析其输出?,c,external-process,C,External Process,我有一个实用程序,可以输出游戏所需的文件列表。如何在C程序中运行该实用程序并获取其输出,以便在同一程序中对其执行操作 最新消息:关于缺乏信息的良好呼吁。该实用程序会输出一系列字符串,这应该可以在Mac/Windows/Linux上移植。请注意,我正在寻找一种编程方式来执行该实用程序并保留其输出(转到stdout)。对于Unix ish环境中的简单问题,请尝试 从手册页: 函数的作用是通过创建管道、分叉和调用shell来打开一个进程 如果您使用读取模式,这正是您所要求的。我不知道它是否在Windo

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


最新消息:关于缺乏信息的良好呼吁。该实用程序会输出一系列字符串,这应该可以在Mac/Windows/Linux上移植。请注意,我正在寻找一种编程方式来执行该实用程序并保留其输出(转到stdout)。

对于Unix ish环境中的简单问题,请尝试

从手册页:

函数的作用是通过创建管道、分叉和调用shell来打开一个进程

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


有关更复杂的问题,请查看进程间通信。

有关Unix ish环境中的简单问题,请尝试

从手册页:

函数的作用是通过创建管道、分叉和调用shell来打开一个进程

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


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

好吧,假设您在windows环境中的命令行上,您可以使用管道或命令行重定向。比如说,

commandThatOutputs.exe > someFileToStoreResults.txt

在您的程序中,您可以使用C标准输入函数读取其他程序的输出(scanf等):。您还可以使用文件示例和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.
}
#包括
#包括
int main(int argc,char*argv[])
{
FILE*fptr;//文件持有者
char c;//字符缓冲区
system(“dir>>temp.txt”);//调用dir并使用重定向将其内容放入临时文件中。
fptr=fopen(“temp.txt”,“r”);//打开所述文件进行读取。
//哦,检查fptr是否为空。
而(1){
c=fgetc(fptr);
如果(c!=EOF)
printf(“%c”,c);//执行您需要的操作。
其他的
break;//到达文件末尾时退出。
}
fclose(fptr);//不要调用此命令,因为fptr为NULL。
删除(“temp.txt”);//清理
getchar();//停止,这样我就可以查看它是否有效。
}

请确保检查您的文件权限:现在,这只会将文件与exe放在同一目录中。您可能希望在nix中使用
/tmp
,或在Vista中使用
C:\Users\username\Local Settings\Temp
,或在2K/XP中使用
C:\Documents and Settings\username\Local Settings\Temp
。我认为
/tmp
可以在OSX中使用,但我从未使用过。

好吧,假设您在windows环境中使用命令行,您可以使用管道或命令行重定向。比如说,

commandThatOutputs.exe > someFileToStoreResults.txt

在您的程序中,您可以使用C标准输入函数读取其他程序的输出(scanf等):。您还可以使用文件示例和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.
}
#包括
#包括
int main(int argc,char*argv[])
{
FILE*fptr;//文件持有者
char c;//字符缓冲区
system(“dir>>temp.txt”);//调用dir并使用重定向将其内容放入临时文件中。
fptr=fopen(“temp.txt”,“r”);//打开所述文件进行读取。
//哦,检查fptr是否为空。
而(1){
c=fgetc(fptr);
如果(c!=EOF)
printf(“%c”,c);//执行您需要的操作。
其他的
break;//到达文件末尾时退出。
}
fclose(fptr);//不要调用此命令,因为fptr为NULL。
删除(“temp.txt”);//清理
getchar();//停止,这样我就可以查看它是否有效。
}

请确保检查您的文件权限:现在,这只会将文件与exe放在同一目录中。您可能希望在nix中使用
/tmp
,或在Vista中使用
C:\Users\username\Local Settings\Temp
,或在2K/XP中使用
C:\Documents and Settings\username\Local Settings\Temp
。我认为
/tmp
可以在OSX中使用,但我从未使用过。

在Linux和OSX中,
pop
system("ls song > song.txt");
#include <stdio.h>

#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;
}
OUTPUT: total 16
OUTPUT: -rwxr-xr-x 1 14077 14077 8832 Oct 19 04:32 a.out
OUTPUT: -rw-r--r-- 1 14077 14077 1549 Oct 19 04:32 main.c