Помогите с программкой, не могу понять как написать ее:
написать программу, находящую в заданном каталоге и всех его подкаталагах все файлы заданного размера. Имя
каталога задается пользователем в качестве третьего аргумента командной строки. Диапазон (мин мах)
размеров файлов задается пользователем в качестве первого и второго аргумента командной строки. Программа
выводит результат поиска в файл(четвертый аргумент командной строки) в виде полный путь, имя файла, его
размер. На консоль выводиться сообщения числа просмотренных файлов.
На линуксе
а что непонятного в задании?
собственно, была какая-то попытка её решить вообще?
задания обычно даются с вполне конкретной целью - научить человека думать.
#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;
time_t to_sec(char *date);
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[1]);
fclose(f);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
s1 = atol(argv[1]);
s2 = atol(argv[2]);
ftw(argv[3],tree,0); //обход дерева
closedir(dr);
fclose(f);
return 0;
}
а где у тебя сам обработчик обхода дерева, собственно? символ tree вообще непонятно где определён. у меня тут линя нет, но что-то я не припомню такой стандартной функции.
tree это есть моя функция обработки, тока как ее написать???
дык, элементарно: проверяй флаги, запрашивай размер файла и проверяй его на валидность. если удовлетворяет заданным условиям - то пиши в лог.
по-тупому параметры типа файла вывода и границ размера можно через глобальные переменные передавать в функцию обработки. ибо всё равно однопоточная прога и никаких проблем быть не должно.
по ходу так?
static int tree (const char *filename, const struct stat *status, int flag)
{
if (flag == FTW_F && status->st_size >= s1 && status->st_size <= s2)
{
}
return 0; //возвращаем 0, чтобы продолжить обход дерева,иначе обход прерывается
}
ну, что-то похожее.
Проверте, раюотает или нет
#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[1]);
fclose(f);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
s1 = atol(argv[1]);
s2 = atol(argv[2]);
ftw(argv[3],tree,0); //обход дерева
closedir(dr);
fclose(f);
return 0;
}
eu8cc, читай об оформлении сообщений: http://www.forum.crossplatform.ru/index.php?showtopic=1455
#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[1]);
fclose(f);
errno = ENOENT;// no such file or directory
perror(", ");
return -1;
}
s1 = atol(argv[1]);
s2 = atol(argv[2]);
nftw(argv[1],tree,0, FTW_DEPTH || FTW_PHYS); //обход дерева
closedir(dr);
fclose(f);
return 0;
}
nftw(argv[1],tree,0, FTW_DEPTH || FTW_PHYS); //обход дерева
// ~~~~~ Наверное здесь, все таки, argv[3]. Не?
Похоже. eu8cc, у меня линукса нет проверить.
Только вот
#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[1]);
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;
}
Из ранее упоминавшейся книги (буквально предыдущий абзац):
я думаю, что тут всё гораздо проще. в задаче ничего не говорится о линках. говорится о файлах. по-моему, это обычная мелкая учебная задача на развитие базовых навыков программирования. а вы её усложняете. хотя, можно и линки туда засандалить без проблем. разницы никакой особой не будет.
я тоже думаю что не нужны линки
Iron Buq, набросайте пожалуйста на ваше усмотрения кода, как Вы считаете она должна быть решаться?
Я уже дальше не знаю что делать. А сдать ее уже нужно.
Iron Bug, я к тому, что это универсальная ф-ция. Что перебирать - определяет пользователь, устанавливая нужные флаги.
eu8cc, у тебя в принципе все уже есть. Нужно только проверить работу программы на реальном каталоге.
По результатам - вносить изменения.
а если так организовать?
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;
}
А чё тут думать?
# find ~ -size 100M
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)