crossplatform.ru

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

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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


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


Новичок


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

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




Репутация:   0  


Цитата(alex977 @ 31.5.2010, 15:57) *
Из книжки А.Роббинс. Linux: программирование в примерах. Пер с англ. - М.: КУДИЦ-ОБРАЗ, 2005. - 656 с.
книга то полезная, но мне нужно срочно справиться с задачей, я так понимаю что мне нужно за мест ftw использовать nftw

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


по ходу так?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 31.5.2010, 16:35
Сообщение #13


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Цитата(eu8cc @ 31.5.2010, 17:13) *
по ходу так?

    nftw(argv[1],tree,0, FTW_DEPTH || FTW_PHYS);    //обход дерева
    //     ~~~~~  Наверное здесь, все таки, argv[3]. Не?

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 31.5.2010, 16:36
Сообщение #14


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

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

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




Репутация:   8  


Похоже. eu8cc, у меня линукса нет проверить.
Только вот

Цитата
} */


какой-то мусор (нет начала комментария).
Насколько я понял - главное ф-цию tree реализовать правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.5.2010, 17:52
Сообщение #15


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(eu8cc @ 31.5.2010, 20:13) *
по ходу так?
дык, а скомпилить и проверить?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 31.5.2010, 18:17
Сообщение #16


Новичок


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

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




Репутация:   0  


Цитата(Litkevich Yuriy @ 31.5.2010, 17:52) *
дык, а скомпилить и проверить?


не могу у меня линукс стоит, но криво


подправил но согласно начальному условию нужно пройти все вложенные каталоги и подкаталоги, интересно это сможет сделать программка?
#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;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 31.5.2010, 20:58
Сообщение #17


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

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

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




Репутация:   8  


Из ранее упоминавшейся книги (буквально предыдущий абзац):

Цитата
Чтобы избавиться от проблем, System V предложила функцию ftw () («file tree walk» - обход дерева файлов). ftw() осуществляла всю работу по «прохождению» дерева (иерархии) файлов. Вы предоставляете ей указатель на функцию, и она вызывает эту функцию для каждого объекта файла, с которым сталкивается. Ваша функция должна затем обработать каждый объект файловой системы, как считает нужным.


Какие объекты будут обрабатываться - вложенные каталоги, файлы, символьные ссылки - определяют флаги.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.6.2010, 6:46
Сообщение #18


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

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

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




Репутация:   12  


я думаю, что тут всё гораздо проще. в задаче ничего не говорится о линках. говорится о файлах. по-моему, это обычная мелкая учебная задача на развитие базовых навыков программирования. а вы её усложняете. хотя, можно и линки туда засандалить без проблем. разницы никакой особой не будет.

Сообщение отредактировал Iron Bug - 1.6.2010, 6:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eu8cc
  опции профиля:
сообщение 1.6.2010, 8:50
Сообщение #19


Новичок


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

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




Репутация:   0  


я тоже думаю что не нужны линки

Iron Buq, набросайте пожалуйста на ваше усмотрения кода, как Вы считаете она должна быть решаться?
Я уже дальше не знаю что делать. А сдать ее уже нужно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
alex977
  опции профиля:
сообщение 1.6.2010, 9:26
Сообщение #20


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

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

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




Репутация:   8  


Iron Bug, я к тому, что это универсальная ф-ция. Что перебирать - определяет пользователь, устанавливая нужные флаги.

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

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 14:43