如何使用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
文件来自不受信任的来源,您必须格外小心。
如何使用 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
文件来自不受信任的来源,您必须格外小心。