用于对名称列表进行排序的Perl脚本,从C脚本传递的文件名,然后传回的已排序列表

时间:2014-10-31 10:16:01

标签: c perl shell sorting file-io

我应该可以使用以下方法对文件进行排序:     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方面)?

1 个答案:

答案 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)所以我可以   读不同的文件名?

当然,snprintfmain的参数是为此而制作的;)

#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;
}