Как читать файлы в каталоге в их лексическом порядке? - PullRequest
0 голосов
/ 23 декабря 2019

Поэтому, прежде чем задавать этот вопрос, я посмотрел эту ветку: Как я могу прочитать файлы в каталоге в отсортированном порядке? Однако это был вопрос, связанный с 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 не инициализирован.

Ответы [ 2 ]

4 голосов
/ 23 декабря 2019
  1. Считывание имен файлов в список.
  2. Сортировка списка по вкусу.
  3. Теперь зациклите этот список и обработайте каждый файл, как и прежде.
0 голосов
/ 23 декабря 2019

Мне не удалось циклически перебрать все файлы в алфавитном порядке, хотя я сделал это по-другому, поскольку все мои файлы называются 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;
}
...