LINUX.ORG.RU

scandir


0

1

помогите написать код со scandir чтобы он выводил из заданной директории только те папки , имена которых состоят из цифр


проверяй каждое имя директории и проверяй функцией bool isNum(const char* name); которую реализуй сам или вот те пример

bool isNum(const char* name)
{
   bool exists;
   char* nums = "0123456789";
   for(int i=0;i<length(name);i++)
   {
     exists = false;
     for(int j=0;j<10;j++)
     {
        if (name[i]==nums[j])
        {
              exists = true;
              break;
        }
     {
      if(!exists) return false; //сто пудова не число
   }
   return true; //число
}

pozitiffcat ★★★
()
Ответ на: комментарий от suv121

скандир возвращает какое то имя каждой папки.. вот ее и проверяй функцией, если в ней есть буквы помимо чисел вернет false если имя только числовое вернет true

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

man scandir!

       int scandir(const char *dirp, struct dirent ***namelist,
              int (*filter)(const struct dirent *),
              int (*compar)(const struct dirent **, const struct dirent **));
Достаточно правильно задать функцию filter, чтобы получить уже готовый список нужных файлов. А функцию эту можно написать по разному, хоть с regexp'ами, хоть с велосипедами :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

а можно поподробнее как мне написать фильтор

suv121
() автор топика
Ответ на: комментарий от Eddy_Em

да не мануалил я скандир... не приходилось, просто дал пример как можно, а счел, что тот кто спрашивает знаком с этой фц-ией, и дал пример как имена папок сравнивать с числами

pozitiffcat ★★★
()

и никто не сказал про strspn...

anonymous
()
Ответ на: комментарий от suv121

это разыменованый struct dirent **namelist;
в него заносятся все элементы найденные ф-цией scandir, namelist[n] это один экземпляр элемента а в поле d_name какраз-таки и лежит имя каталога, которое нужно проверить на числовость и показать на экране если его имя = числу

pozitiffcat ★★★
()
Ответ на: комментарий от suv121

Ну что вам не понятно? Возьмите пример из мана:

       #define _SVID_SOURCE
       /* print files in current directory in reverse order */
       #include <dirent.h>

       int
       main(void)
       {
           struct dirent **namelist;
           int n;

           n = scandir(".", &namelist, 0, alphasort);
           if (n < 0)
               perror("scandir");
           else {
               while (n--) {
                   printf("%s\n", namelist[n]->d_name);
                   free(namelist[n]);
               }
               free(namelist);
           }
       }
Вместо нуля в scandir напишите isNum, а саму функцию исправьте:
int isNum(const char* s) 
{ 
  char *s = strdup(de->d_name);
  int r;
  while (isdigit(*s)) s++; 
  r = !*s;
  free(s);
  return r; 
}

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от pozitiffcat

а как элементы директории перегнать в массив символов?

suv121
() автор топика
Ответ на: комментарий от pozitiffcat

char isNum(const char* name) { int i=strlen(name)-1; do{ if (!isdigit(name[i])) return 0; } while(i--);

return 1; } с этой функцией вместо нуля выводит всё как надо

suv121
() автор топика
Ответ на: комментарий от pozitiffcat

&isNum будет уже двойным указателем :)

а как элементы директории перегнать в массив символов?

/0

можно более понятным языком?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

Ну вот теперь работает, и разбирайся что к чему =) и запоминай ))

pozitiffcat ★★★
()
Ответ на: комментарий от suv121

Жесть! Вы хоть посмотрите, как устроена структура

           struct dirent {
               ino_t          d_ino;       /* inode number */
               off_t          d_off;       /* offset to the next dirent */
               unsigned short d_reclen;    /* length of this record */
               unsigned char  d_type;      /* type of file; not supported
                                              by all file system types */
               char           d_name[256]; /* filename */
           };
Вообще не понимаю, как оно у вас работало, если указатель на нее вы считали char*. Неужели хоть раз возвращался не 0?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

scandir возвращает вам количество считанных узлов, удовлетворяющих условию filter, отсортированных по условию compar. Вам остается лишь из списка struct dirent **namelist создать список char **names. Например, так:

char **names, **ptr;
struct dirent **namelist, **d_ptr;
int i, n;
...
n = scandir(...);
d_ptr = namelist;
...
names = (char**) malloc(n*sizeof(char*));
ptr = names;
for(i=0; i<n; i++)
  ptr++ = strdup(d_ptr++->d_name);
...

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em
#include <vector>

using namespace std;

vector <char*> strs;
//vector <char[256]> strs; //тут я хз

....................
if (n < 0)
               perror("scandir");
           else {
               while (n--) {
                   //printf("%s\n", namelist[n]->d_name);
                   strs.push_back(namelist[n]->d_name);
                   free(namelist[n]);
               }
.......................
pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

Это уже, знаете ли, плюсы будут. В сях тоже подобное можно реализовать, но зачем плодить лишние сущности?

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

Я уже говорил: готовое решение никто за вас делать не будет. А вот направить - запросто.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

Естественно, я же указатель не разыменовал: *(d_ptr++)->d_name

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от suv121

используй вектор и не парься. Для того чтобы извлекать записанные в него данные юзай vector::at(int n) пример

#include <vector>

using namespace std;

vector <char*> strs;
//vector <char[256]> strs; //тут я хз

....................
if (n < 0)
               perror("scandir");
           else {
               while (n--) {
                   //printf("%s\n", namelist[n]->d_name);
                   strs.push_back(namelist[n]->d_name);
                   free(namelist[n]);
               }
.......................
print("%s\n",strs.at(1); //выведет 1 элемент записанный ранее
......................

pozitiffcat ★★★
()
Ответ на: комментарий от pozitiffcat

мне нужно к названию каждой папки спереди /proc а после /status и открыв в каждой папке файл status вывести те в которых первые строчки совпадают с заданной

suv121
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.