所以在问这个问题之前,我看了一下这个线程: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未初始化。
答案 0 :(得分:4)
答案 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;
}