簡體   English   中英

如何按詞法順序讀取目錄中的文件?

[英]How to read files in directory in their lexical 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 未初始化。

  1. 將文件名讀入列表。
  2. 排序列表以品嘗。
  3. 現在循環遍歷這個列表並像以前一樣處理每個文件。

我沒有設法按字母順序循環遍歷所有文件,但我以另一種方式這樣做,因為我的所有文件都被命名為 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM