Поэтому, прежде чем задавать этот вопрос, я посмотрел эту ветку: Как я могу прочитать файлы в каталоге в отсортированном порядке? Однако это был вопрос, связанный с 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 в другой, в которой они были прочитаны.
РЕДАКТИРОВАТЬ: Итак, основываясь на советах Уэстона и Шона, я сделал этоfunction.
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 не инициализирован.