Модераторы: xvr

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сканирование директории и выбор файлов по номеру, помогите реализовать... 
V
    Опции темы
iPlay
Дата 8.3.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Мне нужно просканировать директорию и напечатать имена файлов каталога, которые имеют порядковые номера с 25 по 49, как просканировать директорию понятно а как сделать чтобы выбирался только с 25 по 49?
PM MAIL   Вверх
MAKCim
Дата 8.3.2008, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay
счетчик при сканировании
Код

...
struct dirent * entry;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
    ++count;
    if (count < 25 || count > 49)
        continue;
...
}
...


Это сообщение отредактировал(а) MAKCim - 8.3.2008, 12:52


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 8.3.2008, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Я так понял что чтобы мне вывести имена файлов нужно так сделать?
Код

struct dirent * entry;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
    if (count < 25 || count > 49) 
    continue;
    printf("%s\n", entry[count]->d_name);
    ++count;
}

И вопрос второй как мне передать через консоль имя директории?
Помоему так неправильно будет ведь там типы не сходятся, мне надо передать через консоль в формате <имя программы> -l <имя директории>
Код

while ((entry = readdir(arvg[1])) != NULL)




PM MAIL   Вверх
MAKCim
Дата 8.3.2008, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay
я исправил предыдущий свой пост
там была небольшая ошибка

Цитата(iPlay @  8.3.2008,  12:44 Найти цитируемый пост)
И вопрос второй как мне передать через консоль имя директории?

Код

struct DIR * dir = opendir(argv[2]);
...



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 8.3.2008, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Вот скомпилировал этот код без  printf("%s\n", entry[count]->d_name); прога работает она получается 24 раза выводит TEST.
А почему не получается скомпилировать с printf("%s\n", entry[count]->d_name); я хочу что-бы имена файлов выводило????

Код

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
struct DIR *dir = opendir(argv[2]);
struct dirent **entry;
int count = 0;
while ((entry = readdir(dir)) != NULL) {
    ++count;
    if (count < 25 || count > 49)
        continue;
           // printf("%s\n", entry[count]->d_name);
    printf("TEST!!!");    
}
  return EXIT_SUCCESS;
}

 smile 

 
PM MAIL   Вверх
andrew_121
Дата 8.3.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Потому-что вот так должно быть:
Код

#include <dirent.h> // У меня без оного не хочет...
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
   struct DIR *dir = opendir(argv[1]); // А почему сдесь было 2 ???
   if ( !dir ) { // Проверка на успех...
      printf( "Directory is not exists:%s\n", argv[1] );
      return 1;
   }
   struct dirent *entry; // error
   int count = 0;
   while ((entry = readdir(dir)) != NULL) {
      ++count;
      if (count < 25 || count > 49)
         continue;
      printf( "%s\n", entry->d_name ); // error
   }
   closedir( dir ); // Забыли ???
   return EXIT_SUCCESS;
}




Это сообщение отредактировал(а) andrew_121 - 8.3.2008, 17:12


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
iPlay
Дата 9.3.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Результат довольно странный получился, либо я не дочитал. У меня получается такое я вывел файлы по команде dir /bin а когда запустил свою программу она вывела 24 файла как и требовалось но не попрядку как в команде dir /bin а както вразброс и не с 25го по счету.
Получается файлы которые вывелись по команде dir /bin хоть и стоят попорядку но имеют не последовательный порядковый номер????  


Это сообщение отредактировал(а) iPlay - 9.3.2008, 11:26
PM MAIL   Вверх
andrew_121
Дата 9.3.2008, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



DIR - выводит файлы сортированные по имени, а этот пример по их расположению в файловой системе.
Т.е. ты хочешь сказать что нужна еще и сортировка ???
Хм...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
iPlay
Дата 9.3.2008, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Нет всё нормально.
PM MAIL   Вверх
MAKCim
Дата 9.3.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 84
Всего: 207



iPlay
точнее надо было формулировать вопрос
если нужна сортировка, то вот
Код

...
unsigned long size = 0, count = 0;
for (; (entry = readdir(dir)) != NULL; size += strlen(entry -> d_name) + 1, ++count);
rewinddir(dir);
size += count * sizeof(void*);
unsigned long * address = malloc(size);
char * strings = (char*)(address + count);
while ((entry = readdir(dir)) != NULL)
    size_t length = strlen(entry -> d_name);
    strcpy(strings, entry -> d_name);
    *address++ = strings;
    strings += length + 1;
}
qsort(address - count, count, sizeof(void*), (int (*)(const void*, const void*))&strcmp);
...



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
iPlay
Дата 9.3.2008, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Я просто не подумал что DIR соритрует по именам.

Добавлено через 7 минут и 47 секунд
Я вот в чем запутался 
Код

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]){
  if (argc==3){
    if (argv[1]=="-l") printf("Directory work");
    else printf("Set permission work");
}
  else{ 
  printf("Read permission work");
       
}
return 0;
}


Работать должна вот так <имя программы> <имя файла> - чтение прав.
                                           <имя программы> <имя файла> <права> - установка прав.
                                           <имя программы> -l <директория> - работа с директорией.
Поотдельности всё реализовал а вот вместе чето не могу собрать. Постоянно срабатывает printf("Set permission work") smile 
PM MAIL   Вверх
andrew_121
Дата 9.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Держи, век не расчитаешься...
Код

#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N (1024)

int cmp( const void* p1, const void* p2 ) {
   struct dirent *d1 = ((struct dirent*)p1);
   struct dirent *d2 = ((struct dirent*)p2);
    return strcmp( d1->d_name, d2->d_name );
}

int main(int argc, char *argv[]) {
    struct DIR *dir;
   struct dirent *entry, *ep;
   int count = 0, idx;

    entry = (struct dirent*)malloc( sizeof(struct dirent) * N );
    if ( !entry ) {
        printf( "Memory allocation error!\n" );
        return 1;
    }

   dir = opendir( argv[1] );
   if ( dir == NULL ) { // Проверка на успех...
      printf( "Directory is not exists:%s\n", argv[1] );
      return 1;
   }
   while ((ep = readdir(dir)) != NULL) {
      ++count;
        memcpy( &entry[count], ep, sizeof(struct dirent) );
   }
   closedir( dir ); // Забыли ???

    qsort( entry, N, sizeof(struct dirent*), cmp );

    for ( idx = 0; idx < count; idx++ ) {
        if ( idx < 25 || idx > 49)
            continue;
        printf( "%s\n", entry[idx].d_name );
    }

    free( entry );
    
   return EXIT_SUCCESS;
}

Могут быть какие-то банальные ошибки, это все что тебе остаеться сделать...

Это сообщение отредактировал(а) andrew_121 - 9.3.2008, 14:02


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
iPlay
Дата 9.3.2008, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 177
Регистрация: 23.9.2007

Репутация: нет
Всего: 1



Я в прошлом посте имел ввиду почему у меня не получается правильно считать параметры с консоли.
PM MAIL   Вверх
bsa
Дата 9.3.2008, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 16
Всего: 196



iPlay, потому что си-строки никто оператором == не сравнивает. Для этого есть strcmp()

Это сообщение отредактировал(а) bsa - 9.3.2008, 15:56
PM   Вверх
andrew_121
Дата 9.3.2008, 16:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 3
Всего: 33



Все, Гиблое дело, я умываю руки...


Это сообщение отредактировал(а) andrew_121 - 9.3.2008, 17:20


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.1111 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.