LINUX.ORG.RU

I doubt there's such function in ISO C Library. In Glibc there's "basename(3)".

Murr ★★
()

Нет эта функция не подойдёт, так как она
возвращает имя файла + расширение - отбрасывая
pathname.

Я бы хотел узнать как реализовать функцию откидывающию
от полного имени файла лишь расширение (tar.gz, tgz,...)

anonymous
()

Это шутка? Если нет, лови:

#include <strings.h>

...

char *hardboiledfunction(char *fullpathwithextension)
{
   char *thedot=rindex( (const char *)fullpathwithextension, '.' );
   char *theslash=rindex( (const char *)fullpathwithextension, '/' );

   if(theslash==NULL)
      theslash=fullpathwithextension;

   while(thedot!=NULL)
      if(theslash<thedot){
         *thedot='\0';
         thedot=rindex( (const char *)fullpathwithextension, '.' );
      }else
         break;
   return fullpathwithextension;
}

Die-Hard ★★★★★
()

а использовать сначала basename, а затем в ее результате вместо первой найденной точки ('.') записать '\0', что мешает?

Dead ★★★★
()
Ответ на: комментарий от Dead

Dead (*) (2003-07-23 00:10:57.006497):

> а использовать сначала basename, а затем в ее результате вместо первой найденной точки ('.') записать '\0', что мешает?

Условие задачи ;)

Die-Hard ★★★★★
()
Ответ на: комментарий от Dead

2Dead (*) (2003-07-23 00:10:57.006497):

Пардон, ты прав.

Меня смутила фраза anonymous (*) (2003-07-22 23:04:22.935925):

>Я бы хотел узнать как реализовать функцию откидывающию от полного имени файла лишь расширение

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

Anyway, задача слишком тривиальна для подробного обсасывания.

Die-Hard ★★★★★
()

> а использовать сначала basename, а затем в ее результате вместо первой найденной точки ('.') записать '\0', что мешает?

не получиться, а если файл имеет вид: soft-1.2.3.tar.gz?

anonymous
()
Ответ на: комментарий от anonymous

2anonymous (*) (2003-07-23 01:20:32.666877):

> ...а если файл имеет вид: soft-1.2.3.tar.gz? 8-0?

А что ты хочешь? Это под ДОСом были расширения. Тут такого понятия просто нет.

Die-Hard ★★★★★
()

>А что ты хочешь?

программе на вход подаётся имя файла
$ ./myprog wget-1.8.2.tar.gz
она должна распаковать архив
system("tar -zxpvf ....")
после распаковки создаётся директория
wget-1.8.2
нужно зайти в неё и сделать ./configure
так вот программе нужно знать куда заходить


anonymous
()

Хех, дык в этом архиве, небось, снуружи торчит только один файл - директория со всеми потрохами... Откуда ты знаешь, как она называется? Ну да, скорее всего как имя архива без расширения... А если юзер переименует твой архив в wget.tgz, а? Мля, ну попробуй расковырять архив и взять это имя... или после распаковки скази там, не знаю, glob или еще как-то список получившихся файлов. Ежели там одна директория, или ее имя на первые n символов совмедает с именем архива, хватай ее и входи на здоровье. А ежели их несолько, и совпадающей с именем архива нет, то что?.. Сам думай.

anonymous
()

ну при таком раскладе нужно хранить список воможных расширений
и искать их в имени файла через strstr(). Если нашел, то strstr вернет указатель на начало подстроки, опять же пишем '\0' :)

Dead ★★★★
()

Я так примерно и предпологал

Спасибо всем за помощь

anonymous
()

а может бвыть в путьи файла, искать последнюю точку, и копировать весь путь до позиции последней точки -1 ???

anonymous
()

а может бвыть в пути файла, искать последнюю точку, и копировать весь путь до позиции последней точки -1 ???

anonymous
()

SORRY в пути файла, искать ПЕРВУЮ точку, и копировать весь путь до позиции ПЕРВОЙ точки -1 ???

anonymous
()

Вот как я решил проблему:
#include <stdio.h>
#include <libgen.h>

int main()
{
int i;
char *bname = basename("wget-1.8.2.tgz");
char *name = (char *)malloc(100);
for (i = 0; i < strlen(bname); i++)
{
if (bname[i] == '.')
{
if (bname[i+1] == 't')
printf("%s\n", name);
}
name[i] = bname[i];
}
free((char *)name);

}

Эту функцию придётся ещё править на предмет realloc - но это позже.

anonymous
()
Ответ на: комментарий от anonymous

anonymous (*) (2003-07-23 17:24:20.739006):
Да-уж...
Особенно мне понравилась конструкция
for (i = 0; i < strlen(bname); i++)

1. Попробуй вместо wget-1.8.2.tgz вставить wget-1.t.2.tgz - будешь удивлен!

2. А что у тебя функчия main() возвращает?

3. Твою прогу можно переписАть гораздо элегантнее:

#include <stdio.h>

int main(void)
{
printf("wget-1.8.2\n");
return 0;
}

:-)

Die-Hard ★★★★★
()

А что в этой конструкции такого удивительного?

anonymous
()

Какой-то пост с самого начала бредовый...

anonymous
()

да я согласен что предыдущая функция - херня
Вот я немного переделал:

#include <stdio.h>
#include <libgen.h>

char *get_ext(char *f)
{
int i;
const char *exts[3] = {"tgz", "tar.gz", "tar.bz2"};

char *bname = basename(f);
char *ext = (char *)malloc(7);
for (i=0;i<3;i++)
{
if (ext = strstr(bname, exts[i]))
return ext;
}

}

char *get_name(char *f)
{
int i;
const char *exts[3] = {".tgz", ".tar.gz", ".tar.bz2"};
char *bname = basename(f);
char *name;
char *ext;
for (i=0;i<3;i++)
{
if (ext = strstr(bname, exts[i]))
{
name = (char *)malloc(strlen(bname) - strlen(ext));
strncpy(name, bname, strlen(bname) - strlen(ext));
return name;
}
}
}


main()
{
printf("%s\n", get_ext("/home/user/file.tar.bz2"));
printf("%s\n", get_name("/tmp/files.tar.gz"));

}

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.