LinuxForum.Fans
Тема

Си поиск файла в каталоге

Автор: l_cho 17 сообщений 6001 просмотров
#278754

Господа пишу на С программу да бы ее структуру ни кто не видел после компиляции , она должна находить файл в каталоге , но как задать сравнение с чем искать ? уже и массив искал ни чего не получается , подскажите пожалуйста
if ((ent->d_name) == klon)
printf (" есть такой файл \n");

#278755
"l_cho" написал:
Господа пишу на С программу да бы ее структуру ни кто не видел после компиляции , она должна находить файл в каталоге , но как задать сравнение с чем искать ?

нераспарсил... чего?

#278756

ФИФЕКТЫ РЕЧИ у меня :)

text

  if ((ent->d_name) == klon)    если ((перебор всех файлов и каталогов) == название файла )
тогда  файле есть

Как задать с равнение "название файла" , я так понимаю он может сравнивать только с членом структуры ?

#278757

ОМГ. man 3 strcmp
а потом толстый букварь по Си.

#278868

Букварь не читал , а вот strcmp помогло
Накодил если это можно так назвать

text

#include <stdio.h>
#include <dirent.h>
#include <string.h>

int main (int argc, char *argv []) { struct dirent *dp; DIR *dirp; const char *name; name = argv [1]; dirp = opendir("/var/"); while (dirp) { if ((dp = readdir(dirp)) != NULL) { if (strcmp(dp->d_name, name)== 0) { closedir(dirp); printf ("DIR\n"); return 0; } }else { closedir(dirp); printf ("NO_DIR\n"); return 1; } } return printf ("OPEN_ERROR\n"); }

#278903
"l_cho" написал:
Накодил  если это можно так назвать

не будет работать...
а без прочтения букваря на одном языке с вами сложно говорить....

#278914

Работает ! Что ту может не работать ? Я начал сразу С++ и Синтаксис только его знаком , так что могу предполагать и про С.
Прежде чем утверждать хотя бы проверил .

#278918
"l_cho" написал:
Работает ! Что ту может не работать ?

нуда.... меня кривое форматирование сбило...

#278923

1 Зачем "while (dirp) {" ?
2. Фигово тестировали. Если в каталоге будет много разных файлов, и нужный будет не первым. То ваш код его и не найдет.

Таки стоило почитать букварь. Причем самый, что ни наесть, первый.
Книга "Язык программирования Си" Кернигана и Ритчи.
глава 8.6. "Пример получения списка файлов в каталоге

text

#include <stdio.h>
#include <dirent.h>
#include <string.h>
 
//~ #define NAME_MAX 256
 
int main(int argc, char **argv)
{
    DIR *dfd;
    struct dirent *dp;
    char filename[NAME_MAX];
 
    if ( argc < 2 )
        strcpy(filename, ".");
    else
        strcpy(filename, argv[1]);
 
    printf("%s\n\n", filename);
    dfd=opendir(filename);
 
    while( (dp=readdir(dfd)) != NULL )
            printf("%s\n", dp->d_name);
 
    closedir(dfd);
    return 0;
}
#278925

Тоже "веселая" конструкция:

text
return printf ("OPEN_ERROR\n"); 

Понятно, что в таком мелком "проекике" не существенно.... Но потенциал для создания себе лишних граблей есть.

#278937
"voral" написал:
2. Фигово тестировали.  Если в каталоге будет много разных файлов, и нужный будет не первым. То ваш код его и не найдет.

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

#278939

Согласен такое возвращать нельзя

"voral" написал:
return printf ("OPEN_ERROR\n");

Вы что-то имеете против while , я конечно знаю что прогеры против while , но вроде не плохо работает по такому условию

Зачем "while (dirp) {" ?
#278947

Читать внимательнее надо , а не выводы делать , основанные на невнимательности и собственной гордости . Я вообще не программист. А подобное смог бы прочесть.

#279014
"l_cho" написал:
Вы что-то имеете против while , я конечно знаю что прогеры против while , но вроде не плохо работает по такому условию

Да ни чего я против не имею. Но использование его в данном, конкретном алгоритме считаю нецелесообразным. Как минимум сбивает с толку и заставляет вникать дольше в совершенно тривиальный алгоритм.

"l_cho" написал:
Читать внимательнее надо

Писать грамотнее надо.

"l_cho" написал:
Я вообще не программист. А подобное смог бы прочесть.

Главное, чтоб вы звездной болезнью не захворали от этого....

#279021

PS И ни чего, что на каждой итерации цикла компьютер будет производить одно лишнее сравнение....

#279023

Если научусь писать как Бьерн Страуструп , тогда может заболею. А так извините меня я учится пытаюсь , с толку сбивать не надо. И так как человек по среди океана не знаю куда плыть.

#279035
"l_cho" написал:
А так извините меня я учится пытаюсь , с толку сбивать не надо. И так как человек по среди океана не знаю куда плыть

Если бы вы хотели учиться то попытались понять, что не так в вашем коде, что его не сразу понимают.
Хороший код не тот который безглючно выполняет заданное, но и который логичен и понятен.

Сами подумайте. Условие входа из цикла нам полезно только один раз - если opendir ни чего не открыло нам. Т.е. если этот каталог существует, на протяжении работы этой программы результат этого условия всегда true. Т.е эта проверка совершенно бесполезна. Так сказать вечный цикл.

Так почему же не завязать условия цикла на возможность прочитать следующий файл в открытом каталоге?

Войдите или зарегистрируйтесь, чтобы ответить.