crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V   1 2 3 >  
Ответить в данную темуНачать новую тему
> Нужна срочно помощь, небольшая программка, программирование в линуксе
eu8cc
  опции профиля:
сообщение 31.5.2010, 11:59
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 31.5.2010
Пользователь №: 1769

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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

На линуксе
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.5.2010, 12:05
Сообщение #2


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а что непонятного в задании?
собственно, была какая-то попытка её решить вообще?
задания обычно даются с вполне конкретной целью - научить человека думать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 31.5.2010, 12:50
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 31.5.2010
Пользователь №: 1769

Спасибо сказали: 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;
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;
}


Как можно сделать поиск по размеру?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.5.2010, 12:57
Сообщение #4


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


а где у тебя сам обработчик обхода дерева, собственно? символ tree вообще непонятно где определён. у меня тут линя нет, но что-то я не припомню такой стандартной функции.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 31.5.2010, 13:07
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 31.5.2010
Пользователь №: 1769

Спасибо сказали: 0 раз(а)




Репутация:   0  


tree это есть моя функция обработки, тока как ее написать???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.5.2010, 13:16
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


дык, элементарно: проверяй флаги, запрашивай размер файла и проверяй его на валидность. если удовлетворяет заданным условиям - то пиши в лог.
по-тупому параметры типа файла вывода и границ размера можно через глобальные переменные передавать в функцию обработки. ибо всё равно однопоточная прога и никаких проблем быть не должно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 31.5.2010, 13:47
Сообщение #7


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 31.5.2010
Пользователь №: 1769

Спасибо сказали: 0 раз(а)




Репутация:   0  


по ходу так?
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, чтобы продолжить обход дерева,иначе обход прерывается
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 31.5.2010, 14:57
Сообщение #8


Профессионал
*****

Группа: Модератор
Сообщений: 1609
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 219 раз(а)




Репутация:   12  


ну, что-то похожее.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 31.5.2010, 15:41
Сообщение #9


Новичок


Группа: Новичок
Сообщений: 9
Регистрация: 31.5.2010
Пользователь №: 1769

Спасибо сказали: 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;
}


и как определить полный путь к файлу?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 31.5.2010, 15:57
Сообщение #10


Активный участник
***

Группа: Участник
Сообщений: 310
Регистрация: 19.6.2008
Из: Россия, МО, г.Мытищи
Пользователь №: 206

Спасибо сказали: 77 раз(а)




Репутация:   8  


Цитата(eu8cc @ 31.5.2010, 13:50) *
...
ftw(argv[3],tree,0); //обход дерева
...


Из книжки А.Роббинс. Linux: программирование в примерах. Пер с англ. - М.: КУДИЦ-ОБРАЗ, 2005. - 656 с.

Глава 8
Цитата
Со временем стало ясно, что интерфейс ftw() не вполне выполнял свою работу; например, первоначально он не поддерживал символические ссылки. По этим причинам к Х/Ореn Portability Guide, который теперь является частью POSIX, была добавлена nftwO («new (новая) ftw()» [важно]).


eu8cc, похоже, что эта книжка будет тебе полезной, раз под Линукс прогр-ть собираешься.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V   1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 6.10.2022, 8:09