2015-05-02 5 views
0
DIR *ptr; 
    struct dirent *ent, ent2; 
    int n=0, i=0; 
    dir = "."; 

    ptr = opendir(dir); 
    while((ent = readdir(ptr)) != NULL) 
     { 
      if(ent -> d_type != DT_DIR) 
      { 
       n++; 
      }  
     } 

    char array[n][100]; 

    while((ent2 = readdir(ptr)) != NULL) 
     { 
      if(ent2 -> d_type != DT_DIR) 
      { 
       strcpy(array[i], ent2 -> d_name);  
       i++; 
      }  
     } 

В приведенном выше коде на C я пытался подсчитать количество файлов, исключая папки в рабочем каталоге. Затем используйте count для объявления массива double char, который затем используется для хранения имен файлов. Мне нужно объявить двойной массив, зная количество файлов. (Не разрешено объявлять большой массив). Код отлично работает, когда я объявляю двойной массив с большим размером и просто копирую имена файлов в него без каких-либо подсчетов. Как я понимаю, переменная ent изменяется в течение первого цикла while. Именно по этой причине я использовал другой «struct dirent ent2».Подсчет количества файлов в каталоге в C с использованием dirent не работает во второй раз.

+1

'readdir (ptr)' _Если конец потока каталога достигнут, возвращается NULL – BLUEPIXY

ответ

6

Проблема заключается не в использовании одной и той же переменной для хранения результата readdir - это прекрасно.

Ваша проблема заключается в том, что readdir продвигает позицию DIR *, которую вы используете при каждом его вызове. Когда вы увидите все файлы, этот указатель каталога больше не может быть расширен. Он не возвращается к началу.

Вы можете использовать rewinddir, чтобы сбросить его до первой записи в каталоге. (Или закройте его и снова откройте.)

+0

Используется rewinddir, и он сработал. благодаря – pahan