如何使用popen在C中打印多行?

How to print multiple lines in C, with popen?

如何使用 popen 在 C 中打印多行? 所以我不知道如何打印其余的行 这是一个学校项目,我不知道该怎么做。输入文件只包含一个词。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
    
int main() {
    FILE *f, *fp;
    int MAX=256;
    char buf[MAX];
    
    f=fopen("input", "r");
    
    if(!f){
        fprintf (stderr,"no input \n");
        exit(1);
    }
    
    fgets(buf,MAX,f);
    char cmd[MAX];
    sprintf(cmd, "find ~ -name %s 2>/dev/null", buf);
    
    if ((fp=popen(cmd, "r"))==NULL){
        perror("perror hiba");
        exit(1);
    }
    if (pclose(fp)==-1) perror("pclose error");
    
    close(f);
    return 0;
}

输出只有一行

修复 OP 的实际问题很简单,但我想添加一些他们没有询问的额外说明。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <string.h>
    
int main() {
    FILE *f, *fp;
    int MAX=256;
    char findpath[MAX];
    
    f=fopen("input", "r");
    
    if(!f){
        fprintf (stderr,"no input \n");
        exit(1);
    }
    
    fgets(findpath,MAX,f);
    char cmd[MAX];
    sprintf(cmd, "find ~ -name %s 2>/dev/null", findpath);
    
    if ((fp=popen(cmd, "r"))==NULL){
        perror("perror hiba");
        exit(1);
    }

    char copybuf[MAX];
    // do the copy from the process to the output place
    while (fgets(copybuf, sizeof buf, fp) != NULL)  // read from popen
    {
        // maybe do some other processing on each line
        fputs(copybuf, stdout);
    }

    if (pclose(fp)==-1) perror("pclose error");

    fclose(f);  // not close(f) -- hat tip to Bodo
    return 0;
}

一个小的变化是第一个缓冲区现在是 findpath 而不是 buf - 很容易将您的缓冲区与通用名称混淆,因此获得一个好名字可以帮助避免其中的一些.使用 cmd 是该缓冲区的绝佳选择。

此外:如果从 input 文件中读取的文件名中包含 space(此处假设为“我的文件”),则当前代码将无法正常运行:

    find ~ -name my file 2>/dev/null

这不会达到您的预期,虽然 space 在 Linux 平台上不是很常见,但需要注意这一点。

部分修复是

sprintf(cmd, "find ~ -name '%s' 2>/dev/null", findpath)

可以防止 spaces,但是如果文件名上有单引号怎么办?

实际上这很难做到正确。

但最后,我将把它作为练习留给 reader,如果您的输入文件包含以下内容会怎样:

some_directory; rm -rf ~

注意分号!会发生什么?

如果 input 文件来自不受信任的来源,您必须格外小心。