От новичка до гуру: Курсы программирования на CyberDuff

C Readdir не читает все файлы

Я пытаюсь прочитать и обработать все файлы в каталоге.

Если использовать только readdir() и считать количество файлов в каталоге, то все в порядке. Однако, если я скопирую имя файла strcpy() и перейду к другой функции, readdir() вернет NULL после чтения 4 файлов.

struct A {
    char file_path[100];
    double ave;
};

struct Calc {
    struct A array[10];
    char* max_filename;
    double max;
    char* min_filename;
    double min;
};

int handle() {
    DIR* fd;
    int count = 0;
    struct Calc *calc = calloc(sizeof(struct Calc), 0);

    calc->min = -1;
    calc->min_filename = NULL;
    calc->max = 0;
    calc->max_filename = NULL;

    // open the directory and check
    fd = opendir(DATA_DIR);
    if (fd == NULL)
    {
        printf("Cannot open the directory %s\n", DATA_DIR);
        closedir(fd);
        return -1;
    }

    struct dirent * entry;
    int file_count = 0;
    while ((entry = readdir(fd)) != NULL) {
        if (entry->d_type == DT_REG) { /* If the entry is a regular file */
            file_count++;

            if (count == 9)
            {
                D(calc);
                count = 0;
            }

            struct A *a = &calc->array[count];
            strcpy(a->file_path, entry->d_name);
            calc->array[count].ave = 0;

            C((void*)a);

            count++;
        }
    }   
    printf("Total files: %d\n", file_count);

    closedir(fd);
    D(calc);

    free(calc);
    return 0;
}

int C(void *v)
{
 // code
}

int D(void *v)
{
 // code
}

Кто-нибудь знает, в чем причина этого? Большое спасибо!

04.12.2016

  • calc = calloc(sizeof(struct Calc), 0); Ноль здесь выглядит неправильно. 04.12.2016
  • Вот именно проблема! Я продолжал смотреть на вызовы функций, связанные с readdir(), и полностью игнорировал эту строку! Благодарю вас! Если вы хотите ответить на вопрос, я выберу ваш ответ :) 04.12.2016
  • также, может быть, лучше использовать «strncpy» вместо «strcpy», чтобы избежать переполнения стека? 05.12.2016

Ответы:


1

calc = calloc(sizeof(struct Calc), 0); Ноль здесь выглядит неправильно. Кайлум

27.03.2018
Новые материалы

Основы Spring: Bean-компоненты, контейнер и внедрение зависимостей
Как лего может помочь нашему пониманию Когда мы начинаем использовать Spring, нам бросают много терминов, и может быть трудно понять, что они все означают. Итак, мы разберем основы и будем..

Отслеживание состояния с течением времени с дифференцированием снимков
Время от времени что-то происходит и революционизирует часть моего рабочего процесса разработки. Что-то более забавное вместо типичного утомительного и утомительного процесса разработки. В..

Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

Игра в прятки с данными
Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

«Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

Все о кейсах: Camel, Snake, Kebab & Pascal
В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..