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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с задачкой, правильно ли решил 
:(
    Опции темы
eu8cc
Дата 31.5.2010, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите с программкой, не могу понять как написать ее:

написать программу, находящую в заданном каталоге и всех его подкаталагах все файлы заданного размера. Имя каталога задается пользователем в качестве третьего аргумента командной строки. Диапазон (мин мах) размеров файлов задается пользователем в качестве первого и второго аргумента командной строки. Программа выводит результат поиска в файл(четвертый аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводиться сообщения числа просмотренных файлов. 

На линуксе


Код

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>

size_t s1,s2; //размер файлов в диапазоне s1 <= x <= s2
FILE *f = NULL;

static int tree (const char *filename, const struct stat *status, int flag)
    if (flag == FTW_F && status->st_size >= s1 && status->st_size <= s2)
    {
        fprintf(f,"%-40s %-10jd %s\n",filename, (intmax_t) status->st_size);//пишем в файл
    }
    return 0; //возвращаем 0, чтобы продолжить обход дерева,иначе обход прерывается
}

int main (int argc,char* argv[])
{
    
    if (argc != 5)
    {    
        fprintf(stderr,"Не все параметры заданы\n");
        errno = EINVAL; //invalid arguments
        perror(argv[0]);
        printf("формат: нач_размер кон_размер папка имя_файла\n");
        return -1;    
    }    
    f = fopen (argv[4],"w+");    
    if ( f == NULL)
    {
        printf("NULL\n");
        fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
        perror(", ");
        return -1;
    }    */
    DIR *dr = opendir(argv[3]);    
    if (dr == NULL)    
    {
        fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
        fclose(f);
        errno = ENOENT;// no such file or directory
        perror(", ");
        return -1;
    }
    s1 = atol(argv[1]);
    s2 = atol(argv[2]);
    nftw(argv[3],tree,0, FTW_DEPTH || FTW_PHYS);    //обход дерева
    closedir(dr);
    fclose(f);
    return 0;
}


если есть возможность то проверьте работает ли код
PM MAIL   Вверх
Фантом
Дата 31.5.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 4
Всего: 49



Ну, для начала, она просто не компилируется.  smile После 10-й строки забыта открывающая фигурная скобка, в 35-й зачем-то закрывается не открывавшийся до этого комментарий и т.д.

Ну и дурацкий вопрос - зачем стрелять из пушки по воробьям, если есть find? Или это такое учебное задание?
PM   Вверх
eu8cc
Дата 31.5.2010, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



подправил
Код

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>

size_t s1,s2; //размер файлов в диапазоне s1 <= x <= s2
FILE *f = NULL;

static int tree (const char *filename, const struct stat *status, int flag)
    if (flag == FTW_F && status->st_size >= s1 && status->st_size <= s2)
    {
        fprintf(f,"%-40s %-10jd %s\n",filename, (intmax_t) status->st_size);//пишем в файл
    }
    return 0; //возвращаем 0, чтобы продолжить обход дерева,иначе обход прерывается

int main (int argc,char* argv[])
{
    
    if (argc != 5)
    {    
        fprintf(stderr,"Не все параметры заданы\n");
        errno = EINVAL; //invalid arguments
        perror(argv[0]);
        printf("формат: нач_размер кон_размер папка имя_файла\n");
        return -1;    
    }    
    f = fopen (argv[4],"w+");    
    if ( f == NULL)
    {
        printf("NULL\n");
        fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
        perror(", ");
        return -1;
    }    
    DIR *dr = opendir(argv[3]);    
    if (dr == NULL)    
    {
        fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
        fclose(f);
        errno = ENOENT;// no such file or directory
        perror(", ");
        return -1;
    }
    s1 = atol(argv[1]);
    s2 = atol(argv[2]);
    nftw(argv[3],tree,0, FTW_DEPTH || FTW_PHYS);    //обход дерева
    closedir(dr);
    fclose(f);
    return 0;
}


предложите еще как можно ее решить, вроде подправил, если есть возможность то проверте
PM MAIL   Вверх
Фантом
Дата 31.5.2010, 19:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 4
Всего: 49



Цитата(eu8cc @  31.5.2010,  19:11 Найти цитируемый пост)
подправил

Незаметно. Первая из упомянутых ошибок никуда не делась
Цитата(eu8cc @  31.5.2010,  19:11 Найти цитируемый пост)

предложите еще как можно ее решить

Вот такой командой в консоли: find "стартовый каталог" -size +<минимальный размер> -size -<максимальный размер>.
Ну, например, что-то такое:
Код

find /home/user -size +800k -size -3M

Будет искать все файлы в /home/user и подкаталогах, с размером от 800 кб до 3 Мб.  Если требуется строго то поведение, которое описано выше, можно сляпать такой скрипт:
Код

#!/bin/sh
find $3 -size +$1 -size -$2 > $4
cat $4 | wc -l

Он будет делать в точности то, что требовалось, и не надо городить огород на языке, который для таких задач не предназначен.


PM   Вверх
eu8cc
Дата 31.5.2010, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а сейчас видно? )))
мне не нужен поиск с командной строки, а нужна программа которая ищет согласно заданным аргументам!!!
если можете то помогите пожалуйста

Код

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>

size_t s1,s2; //размер файлов в диапазоне s1 <= x <= s2
FILE *f = NULL;

static int tree (const char *filename, const struct stat *status, int flag)
{
    if (flag == FTW_F && status->st_size >= s1 && status->st_size <= s2)
    {
        fprintf(f,"%-40s %-10jd %s\n",filename, (intmax_t) status->st_size);//пишем в файл
    }
    return 0; //возвращаем 0, чтобы продолжить обход дерева,иначе обход прерывается
}
int main (int argc,char* argv[])
{
    
    if (argc != 5)
    {    
        fprintf(stderr,"Не все параметры заданы\n");
        errno = EINVAL; //invalid arguments
        perror(argv[0]);
        printf("формат: нач_размер кон_размер папка имя_файла\n");
        return -1;    
    }    
    f = fopen (argv[4],"w+");    
    if ( f == NULL)
    {
        printf("NULL\n");
        fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
        perror(", ");
        return -1;
    }    
    DIR *dr = opendir(argv[3]);    
    if (dr == NULL)    
    {
        fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
        fclose(f);
        errno = ENOENT;// no such file or directory
        perror(", ");
        return -1;
    }
    s1 = atol(argv[1]);
    s2 = atol(argv[2]);
    nftw(argv[3],tree,0, FTW_DEPTH || FTW_PHYS);    //обход дерева
    closedir(dr);
    fclose(f);
    return 0;
}




Это сообщение отредактировал(а) eu8cc - 31.5.2010, 20:00
PM MAIL   Вверх
Фантом
Дата 31.5.2010, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 4
Всего: 49



Цитата(eu8cc @  31.5.2010,  19:53 Найти цитируемый пост)
мне не нужен поиск с командной строки, а нужна программа которая ищет согласно заданным аргументам!!!

Т.е. все-таки нужно одевать штаны через голову?

P.S. Ошибка сегментирования. 
PM   Вверх
eu8cc
Дата 31.5.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Фантом @  31.5.2010,  20:10 Найти цитируемый пост)
Т.е. все-таки нужно одевать штаны через голову?

 именно так, вот и приходится мучиться с этим кодом.

PM MAIL   Вверх
bilbobagginz
Дата 1.6.2010, 04:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



Цитата(eu8cc @  31.5.2010,  19:24 Найти цитируемый пост)
 именно так, вот и приходится мучиться с этим кодом.

судя по реакции на вопросы - явно не автору топика...



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
ller
Дата 1.6.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 325
Регистрация: 4.8.2008
Где: г. Таганрог

Репутация: 2
Всего: 4



если дали такое задание на учебе, то надо делать. И там кстати все задания, которые кто то уже решил, разбить на подстроки, заменить в массиве ну итд итп
PM MAIL   Вверх
eu8cc
Дата 1.6.2010, 18:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня такое впечатление что никто здесь не разбирается в линуксе, я на большую половину решил задание, а никто не может дальше его продолжить. Или хотя бы проверить на правильность. Синтаксические ошибки я и сам вижу(где не хватает фигурной скобки, или не ту цифру поставил). Извиняюсь, но уже надоели эти разговори в пустую, сколько можно ходить около. Хочется конкретики услышать, например: вставь этот оператор, или здесь нужно что бы было так. Не хочу никого обижать, но так получается. 
PM MAIL   Вверх
djamshud
Дата 1.6.2010, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


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

Репутация: 4
Всего: 39



Код за вас писать не буду, но расскажу, как эта костыльная задача решается. Все очень просто.

1. Делается рекурсивная функция
Код

void find(char const *dirname,int minsize,int maxsize,FILE *out);

2. В ней открываете директорию (man 3 opendir) и читаете друг за дружкой все файлы в ней (man 3 readdir).
3. Если это обычный файл, смотрите его размер (man 3 stat), сравниваете с minsize и maxsize; условие проходит - пишите имя файла в out (man 3 fprintf). Если это директория, отправляетесь в рекурсию (man 7 рекурсия).
4. В main читаете аргументы командной строки и передаете их в эту функцию.
5...
6. PROFIT

//int minsize,int maxsize,FILE *out - можно сделать глобальными.

Добавлено через 53 секунды
>У меня такое впечатление что никто здесь не разбирается в линуксе

Я вам доказал, что разбираюсь в линупсе! Теперь я смогу уснуть спокойно. Фхуууу!


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Фантом
Дата 1.6.2010, 21:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вы это прекратите!
***


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

Репутация: 4
Всего: 49



Цитата(eu8cc @  1.6.2010,  18:22 Найти цитируемый пост)
Извиняюсь, но уже надоели эти разговори в пустую, сколько можно ходить около. Хочется конкретики услышать, например: вставь этот оператор, или здесь нужно что бы было так. Не хочу никого обижать, но так получается.  

Хм... а Вы не задумывались над тем, что пытаться просить кого-то Вам помочь, не удосужившись хотя бы проверить свой код на синтаксическую корректность, несколько неприлично?
PM   Вверх
eu8cc
Дата 1.6.2010, 22:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо djamshud за разъяснения. 
PM MAIL   Вверх
nickless
Дата 2.6.2010, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 2
Всего: 181



Модератор: Перенесено из Общих вопросов по никсам


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
eu8cc
Дата 7.6.2010, 08:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(djamshud @  1.6.2010,  20:45 Найти цитируемый пост)
1. Делается рекурсивная функцияБез подсветки1:void find(char const *dirname,int minsize,int maxsize,FILE *out);highlightSyntax('nocolor_jFiNzB','nocolor');2. В ней открываете директорию (man 3 opendir) и читаете друг за дружкой все файлы в ней (man 3 readdir).3. Если это обычный файл, смотрите его размер (man 3 stat), сравниваете с minsize и maxsize; условие проходит - пишите имя файла в out (man 3 fprintf). Если это директория, отправляетесь в рекурсию (man 7 рекурсия).4. В main читаете аргументы командной строки и передаете их в эту функцию.



Просмотрите, я правильно записал?

Код

int minsize;
        int maxsize;
        FILE *out;
        int i=0;
        
        void find(char const *dirname,int minsize,int maxsize,FILE *out);
        {
          DIR *dr=opendir (const char *dirname);  
          if (dr==NULL)
           {
             fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname);
             fclose(f);
             errno = ENOENT;
             perror(", ");
             return -1; exit(1);
           }
           
           struct dirent *dt;
           while((dt=readdir(dr)))
           {
                if(dt->d_type=DT_DIR) find;
                if(dt->d_type=DT_REG)
                {
                if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize))) 
                {
                  fprintf(f,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size);
                  i=i+1;
                }
                }
           }        
        }


Добавлено @ 08:22
немного подправил

Код

#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>

int minsize;
int maxsize;
FILE *out = NULL;
int i=0;
void find(char const *dirname,int minsize,int maxsize,FILE *out);
{
  DIR *dr=opendir (const char *dirname);  
  if (dr==NULL)
         {
     fprintf(stderr,"Невозможно открыть директорию \"%s\"",dirname);
     fclose(out);
     errno = ENOENT;
     perror(", ");
     return -1; exit(1);
   }
   
   struct dirent *dt;
   while((dt=readdir(dr)))
   {
        if(dt->d_type=DT_DIR) find;
        if(dt->d_type=DT_REG)
        {
            if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize))) 
            {
              fprintf(out,"%-40s %-10jd %s\n",filename, (intmax_t) dt->st_size);
              i=i+1;
            }
        }
   }
return 0;   
}
int main (int argc,char* argv[])
{
  
    if (argc != 5)
    {    
        fprintf(stderr,"Не все параметры заданы\n");
        errno = EINVAL; //invalid arguments
        perror(argv[0]);
        printf("формат: нач_размер кон_размер папка имя_файла\n");
        return -1;    
    }    
    out = fopen (argv[4],"w+");    
    if ( out == NULL)
    {
        printf("NULL\n");
        fprintf(stderr,"Ошибка создания файла \"%s\"",argv[4]);
        perror(", ");
        return -1;
    }    
    DIR *dr = opendir(argv[3]);    
    if (dr == NULL)    
    {
        fprintf(stderr,"Невозможно открыть директорию \"%s\"",argv[3]);
        fclose(out);
        errno = ENOENT;// no such file or directory
        perror(", ");
        return -1;
    }
    minsize = atol(argv[1]);
    maxsize = atol(argv[2]);
    dirname = argv[3]
    find(*dirname,minsize, maxsize, FILE *out);
    printf ("Число просмотренных файлов равно %d\n", i);
    closedir(dr);
    fclose(out);
    return 0;
}


Это сообщение отредактировал(а) eu8cc - 7.6.2010, 08:25
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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