[英]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 未初始化。
我沒有設法按字母順序循環遍歷所有文件,但我以另一種方式這樣做,因為我的所有文件都被命名為 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.