Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > проблемы со scandir


Автор: Smasher 5.7.2009, 16:00
Здравсвуйте. Мне вот надо написать обход каталога на с++ в Linux. Для этого использую функцию scandir но она как то сортирует по неизвестному критарию, даже когда ставлю параметр alphasort. Вот привожу код:

Код

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h>
#include <errno.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <iostream>
using namespace std;
#define _STRLEN_ 1024
main()
{
 struct dirent **namelist;
   int n;
    char bufStr[_STRLEN_];
    struct stat bufInfo;
   char *path="/windowsD";
   n = scandir(path, &namelist,0, alphasort);
   if (n < 0)
       perror("scandir");
   else {
       while(n--) 
       {
           strcpy (bufStr, path);              // Копируем в него текущую директорию
      strcat (bufStr, "/");                     // Я думаю тоже no comment
      strcat (bufStr, namelist[n]->d_name);         // Добавляем имя текущего файла
      stat (bufStr, &bufInfo);
      if(S_ISDIR (bufInfo.st_mode))
          cout<<namelist[n]->d_name<<endl;
           //printf("%s\n", namelist[n]->d_name);
           //free(namelist[n]);
       }
       //free(namelist);
   }
}



Если ставлю свою функцию на мето параметра функции сортировки, т.е. вместо alphasort свою функцию, то ругается на это.  Так же при текущих подключенных библиотеках не находит функцию free хотя она лежит в #include <dirent.h>, а она подключена.

Заранее благодарен. Особенно жду ответа на вопрос как огрганизовать правильную сортировку!

Автор: nickless 5.7.2009, 16:29
Оно сортирует правильно, просто ты выводишь в обратном порядке. Когда примеры из мана копипастишь, смотреть надо что они делают ;) 

Цитата(Smasher @  5.7.2009,  15:00 Найти цитируемый пост)
не находит функцию free хотя она лежит в #include <dirent.h>

free из <cstdlib>

ЗЫ
Код у тебя - уже как-бы не C, но еще не совсем C++ smile 

Автор: Smasher 5.7.2009, 16:53
вот я првиел как сортирует.
Мои документы
winclient
progs
myac
System Volume Information
RECYCLER
Patch
Linux
..
.
$RECYCLE.BIN
Press [Enter] to close the terminal ...

видно же что не по парядку, даже не в обратном порядке, ведь progs и  Patch даже близко рядом не находятся.. а я понял оно сортирует отдельно ещё по регистарм, но как от этого избавится?

Автор: andrew_121 5.7.2009, 18:45
Цитата(Smasher @  5.7.2009,  16:53 Найти цитируемый пост)
ведь progs и  Patch даже близко рядом не находятся

Про регистр забыл.

Добавлено через 2 минуты и 13 секунд
Цитата(Smasher @  5.7.2009,  16:53 Найти цитируемый пост)
я понял оно сортирует отдельно ещё по регистарм, но как от этого избавится?

В качестве указателя на функцию сортировки, передай свою.

Автор: Smasher 5.7.2009, 18:53
да я нашёл их можно сравнить командой ‘stricmp’, но подключив все нужные библиотеки(#include <stdio.h> #include <string.h>) мне выдало:
ошибка: нет декларации ‘stricmp’ в этой области видимости
в какой она находится библиотеке?

Автор: Smasher 5.7.2009, 22:29
помогите плиззз

Автор: andrew_121 6.7.2009, 00:26
Читай маны внимательней.
http://www.opennet.ru/cgi-bin/opennet/man.cgi?topic=scandir&category=3
Вместо stricmp() нужно использовать strncasecmp()

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)