Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с задачкой

32K
07 июня 2010 года
eu8cc
8 / / 23.11.2007
Задачка:написать программу, находящую в заданном каталоге и всех его подкаталагах все файлы заданного размера. Имя каталога задается пользователем в качестве третьего аргумента командной строки. Диапазон (мин мах) размеров файлов задается пользователем в качестве первого и второго аргумента командной строки. Программа выводит результат поиска в файл(четвертый аргумент командной строки) в виде полный путь, имя файла, его размер. На консоль выводиться сообщения числа просмотренных файлов.

Проверьте пожалуйста код?

Цитата:

од

#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;
}


307
07 июня 2010 года
Artem_3A
863 / / 11.04.2008
в смысле проверьте? ты ее компилил? компилится? запускал? работает? какие еще тогда проверки???
32K
07 июня 2010 года
eu8cc
8 / / 23.11.2007
я его не могу скомпилировать, нету среды, а ошибки там есть, поэтому и прошу у вас помощи как у опытных
307
07 июня 2010 года
Artem_3A
863 / / 11.04.2008
линукса любая есть??? тогда

 
Код:
g++ file.cpp
32K
07 июня 2010 года
eu8cc
8 / / 23.11.2007
писал gcc файл и !gcc файл ничего не компилировал
297
07 июня 2010 года
koodeer
1.2K / / 02.05.2009
У мну тоже щас Линукса под рукой нет. Компилирование взглядом и запуск в голове показали:
 
Код:
// вместо
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]=[/COLOR]DT_REG)

// нужно
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_DIR) {find();}
if(dt->d_type[COLOR="Red"]==[/COLOR]DT_REG)



За названия переменных minsize, maxsize - хвалю. А вот название i неудачное. Лучше что-то вроде count.

Зачем minsize, maxsize, *out сделаны глобальными? Ведь в функцию find они передаются как параметры, стало быть лучше объявить их в функции main.

Количество просмотренных файлов лучше получать не через глобальную переменную, а через возвращаемое значение функции:
Код:
int find(char const *dirname,int minsize,int maxsize,FILE *out) // [COLOR="Red"];[/COLOR] - здесь лишний знак точка с запятой
{
    int count = 0;
    //...
    return count;
}

int main (int argc,char* argv[])
{
    int minsize, maxsize;
    FILE *out = NULL;
    //...
    int count = find(*dirname,minsize, maxsize, FILE *out);
    //...
}
32K
07 июня 2010 года
eu8cc
8 / / 23.11.2007
Большое Вам спасибо, а как размер файла? мне сказали что нужно использовать stat И еще одно, нужно передать параметры в рекурсию функцию find Подправлю исходник.
32K
07 июня 2010 года
eu8cc
8 / / 23.11.2007
Немножко подкорректировал

Код:
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <ftw.h>
#include <sys/stat.h>
#include <time.h>
#include <stdint.h>

int count = 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=readdir(dr);
   while(dt)
   {

        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);
              count=count+1;
            }
        }
   }
return count;  
}
int main (int argc,char* argv[])
{
    int minsize, maxsize;
    FILE *out = NULL;
    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]
    int count = find(*dirname,minsize, maxsize, FILE *out);
    printf ("Число просмотренных файлов равно %d\n", count);
    closedir(dr);
    fclose(out);
    return 0;
}

только тут еще есть такие ошибки:
if(((dt->st_size)>minsize) $$ ((dt->st_size)<maxsize))) где dt должно быть структурой stat и необходимо передать параметры рекурсии find();
307
07 июня 2010 года
Artem_3A
863 / / 11.04.2008
[оффтоп]

лень все таки страшная сила, проще написать на форум и ждать ответа, чем сделать

 
Код:
sudo apt-get install codelite, codeblocks, anjuta, .....(или еще чего, по вкусу)


и наслаждать вменяемой средой разработки!:)
2.1K
07 июня 2010 года
Norgat
452 / / 12.08.2009
Цитата: Artem_3A
[оффтоп]

лень все таки страшная сила, проще написать на форум и ждать ответа, чем сделать

 
Код:
sudo apt-get install codelite, codeblocks, anjuta, .....(или еще чего, по вкусу)


и наслаждать вменяемой средой разработки!:)



sudo apt-get install vim
тратим 2-3 дня на начальную настройку и освоение, и наслаждаемся:)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог