我应该可以使用以下方法对文件进行排序: perl -e'打印排序<>' DATA_FILE
我想做的是从C脚本调用此脚本。 C脚本将数据文件名传递给Perl脚本,然后读取已排序的输出。
我准备好了代码:
#include <stdio.h>
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
int main(void){
FILE *cmd = popen("myperlscript myparams", "r");
char result[1024];
while (fgets(result, sizeof(result), cmd) != NULL)
printf("%s", result);
pclose(cmd);
return 0;
}
那么我如何传递文件中的姓氏列表:data.txt从C到Perl并将排序列表输出到stdout? (它的Perl方面)?
答案 0 :(得分:4)
只需替换
FILE *cmd = popen("myperlscript myparams", "r");
与
FILE *cmd = popen("perl -e 'print sort <>' data.txt", "r");
我建议您查看popen
的结果,使用此结果:
#include <stdio.h>
#include <stdlib.h>
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
int main(void)
{
FILE *cmd;
char result[1024];
FILE *cmd = popen("perl -e 'print sort <>' data.txt", "r");
if (cmd == NULL) {
perror("popen");
exit(EXIT_FAILURE);
}
while (fgets(result, sizeof(result), cmd)) {
printf("%s", result);
}
pclose(cmd);
return 0;
}
是否可以传递文件名? (data.txt)所以我可以 读不同的文件名?
当然,snprintf
和main
的参数是为此而制作的;)
#include <stdio.h>
#include <stdlib.h>
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
int main(int argc, char *argv[])
{
char result[1024], str[128];
FILE *cmd;
if (argc != 2) {
fprintf(stderr, "Usage %s filename\n", argv[0]);
exit(EXIT_FAILURE);
}
snprintf(str, sizeof str, "perl -e 'print sort <>' %s", argv[1]);
cmd = popen(str, "r");
if (cmd == NULL) {
perror("popen");
exit(EXIT_FAILURE);
}
while (fgets(result, sizeof result, cmd)) {
printf("%s", result);
}
pclose(cmd);
return 0;
}
我实际上会提示用户输入文件名 程序开始,所以传递argv将无法正常工作。 (我相信,很新 到C)我可以将其更改为perlSort函数,然后传递 那种争论,是吗?为了使这更容易:---启动程序 ---提示源数据文件的用户---提示目的地数据文件的用户---显示菜单:1 - 用C 2排序 - 用Perl 3排序 - 查找 Perl的话
所以你想要用勺子喂,好吧,没问题,但下次先自己做一些努力,否则你永远不会学到:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
FILE *popen(const char *command, const char *mode);
int pclose(FILE *stream);
int main(void)
{
char result[1024], tmp[128], *p;
FILE *cmd;
printf("Enter a filename: ");
fgets(tmp, sizeof tmp, stdin);
p = strchr(tmp, '\n');
if (p != NULL) *p = '\0';
snprintf(result, sizeof result, "perl -e 'print sort <>' %s", tmp);
cmd = popen(result, "r");
if (cmd == NULL) {
perror("popen");
exit(EXIT_FAILURE);
}
while (fgets(result, sizeof result, cmd)) {
printf("%s", result);
}
pclose(cmd);
return 0;
}