C语言中,调用外部程序并解析其输出,可以使用 popen() 函数。popen() 函数可以执行外部程序并通过管道读取它的输出。可以将外部程序的输出传递给一个文件指针,并通过文件操作函数(例如 fgets())读取结果。之后,可以解析输出的内容。

1、使用 system() 执行外部程序

system() 函数可以运行外部程序,但不能获取程序的输出。它通常用于执行简单的命令。

#include <stdlib.h>

int main() {
    system("ls -l");  // 执行外部程序 'ls -l' 并显示目录内容
    return 0;
}

2、使用 popen() 获取外部程序的输出

popen() 函数比 system() 更灵活,因为它能创建一个管道来获取外部程序的输出。可以将管道的输出作为文件流来处理。

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

int main() {
    FILE *fp;
    char path[1035];

    // 打开管道来执行外部命令,并获取其输出
    fp = popen("ls -l", "r");
    if (fp == NULL) {
        perror("popen failed");
        return 1;
    }

    // 读取并打印输出
    while (fgets(path, sizeof(path)-1, fp) != NULL) {
        printf("%s", path);  // 打印外部程序的输出
    }

    // 关闭文件流
    fclose(fp);
    return 0;
}

3、使用 popen() 执行命令并解析输出

如想解析外部程序的输出,可以直接读取并处理它。如希望执行 ls -l 并从中提取某些信息(如文件的大小)。

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

int main() {
    FILE *fp;
    char line[256];

    fp = popen("ls -l", "r");
    if (fp == NULL) {
        perror("popen failed");
        return 1;
    }

    // 逐行读取输出并解析
    while (fgets(line, sizeof(line), fp) != NULL) {
        int size;
        char filename[256];

        // 假设输出格式为 "rwxr-xr-x 1 user group 12345 Jan 1 12:00 file.txt"
        // 我们解析出文件的大小和文件名
        if (sscanf(line, "%*s %*d %*s %*s %d %*s %*s %*s %s", &size, filename) == 2) {
            printf("File: %s, Size: %d bytes\n", filename, size);
        }
    }

    fclose(fp);
    return 0;
}

注意:popen() 运行时创建了一个进程,它的输出流就像一个文件一样,可以逐行读取或进行其他操作来处理数据。

推荐文档