如何按目录顺序阅读目录中的文件?

时间:2019-12-22 23:05:15

标签: c readdir lexical

所以在问这个问题之前,我看了一下这个线程:How can I read the files in a directory in sorted order? 但是,这是与Perl相关的问题,我无法提取解决问题所需的信息。

所以...这是我做的功能:

SEQUENCE *init_TSEQ(int nseq)
{
    DIR *D=opendir("sequences");
    struct dirent *entry;
    SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*nseq);
    FILE *F;
    int i=0;

    chdir("sequences");

    while(((entry=readdir(D))!=NULL) && (i<nseq))
    {
        if(entry->d_type==DT_REG)
        {
            char seq[MAXSIZE];

            F=fopen(entry->d_name, "r");
            fscanf(F, "%s", seq);
            TSEQ[i].lenght=strlen(seq);

            for (int j=0; j<TSEQ[i].lenght; j++)
            {
                fscanf(F, "%c", seq);
                TSEQ[i].c[j]=seq[j];
            }

            fclose(F);
            i++;
        }
    }

    closedir(D);

    return TSEQ;
}

似乎此函数按文件在计算机内存中存储的顺序读取文件,但我希望它按其词法顺序读取文件(它们的名称为seq1,seq2等。)。 我该怎么办?这非常重要,因为随后将序列存储在另一个已读取序列的TSEQ变量中。

编辑:因此,基于韦斯顿和肖恩的技巧,我实现了此功能。

SEQUENCE *init_TSEQ(int nseq)
{
    SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*nseq);
    struct dirent **namelist;
    FILE *F;
    char seq[MAXSIZE];
    int n;

    chdir("sequences");

    n=scandir("sequences", &namelist, 0, alphasort);

    if(n>=0)
    {
        for(int i=0; i<n; i++)
        {
            F=fopen(namelist[i]->d_name, "r");
            fscanf(F, "%s", seq);
            TSEQ[i].lenght=strlen(seq);

            for (int j=0; j<TSEQ[i].lenght; j++)
            {
                fscanf(F, "%c", seq);
                TSEQ[i].c[j]=seq[j];
            }
            fclose(F);
            free(namelist[i]);
        }
        free(namelist);
    }

    return TSEQ;
}

但是,当我尝试显示一个序列(存储在TSEQ中)时,valgrind说TSEQ.lenght未初始化。

2 个答案:

答案 0 :(得分:4)

  1. 将文件名读入列表。
  2. 排序列表以品尝。
  3. 现在循环浏览此列表并像以前一样处理每个文件。

答案 1 :(得分:0)

我没有设法按字母顺序循环浏览所有文件,由于我的所有文件都被命名为seq1,seq2等,所以我以另一种方式进行了操作。

SEQUENCE *init_TSEQ(int nseq)
{
    SEQUENCE *TSEQ=malloc(sizeof(SEQUENCE)*(nseq+1));
    char seq[MAXSIZE];
    FILE *F;

    chdir("sequences");

    for(int i=1; i<=nseq; i++)
    {
        char buf[0x100];

        snprintf(buf, sizeof(buf), "seq%d.txt", i);
        F=fopen(buf, "r");
        fscanf(F, "%s", seq);
        TSEQ[i].lenght=strlen(seq);

        for (int j=0; j<TSEQ[i].lenght; j++)
        {
            fscanf(F, "%c", seq);
            TSEQ[i].c[j]=seq[j];
        }

        fclose(F);
    }

    return TSEQ;
}