Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как избежать регистра при проверке расшиерния?


Автор: Miyka 13.3.2009, 17:14
Здравствуйте. Я не опытный программист на С++. Столкнулся с проблемой проверки расширения файла, а именно при открытии. Написанный мною и моим товарищем код, очень привязан к регистру. Но всех вариантов с каким регистром можно писать буковки в расширении не перебрать и следовательно в этом и есть проблема. Как сделать так что бы проге было все ровно каким регистром написано расширение?

Код

    string check=(string)StartDir+(string)dir; // тут получается адрес файла ил папки
    char*mask=".txt .TXT .htm .HTM .html .HTML .php .PHP";
    char* form,*end;
    int flag=0;
    string dir1=mask;
    form = new char [dir1.size()+1];
    strcpy (form, mask);
    end = strtok(form," ");
        while  (end !=NULL)
        {
        if(check.find((string)end)!=string::npos) flag=1;//файл
        end = strtok(NULL," ");
        }
    if(flag==1) return 1;
    else return 0;

В общем примерно так... если какие то вопросы ко мне то задавайте...

Автор: andrew_121 13.3.2009, 17:39
Приведи свои расширения и получаемые к одному регистру, и сравнивай.

Автор: Miyka 13.3.2009, 17:42
Гениально!!! Щас поработаю над этим.

А вообще адекватно делать проверку расширения таким образом?

Автор: Miyka 13.3.2009, 18:39
нет, не понятно т.к. не работает.

Код

BOOL FileOrFolder(char* dir){
    strupr((char*) dir());
    string check=(string)StartDir+(string)dir;
        char*mask=".txt .htm .html .php";

// дальше как постом выше



не понимаю....
Еще вопрос: адекватно ли использовать такой метод проверки?

Автор: andrew_121 13.3.2009, 18:57
Miyka, Выложи полный код функции! Ваще въехать не могу.

Автор: Miyka 13.3.2009, 18:59
Код

BOOL FileOrFolder(char* dir){
    strupr((char*) dir());
    string check=(string)StartDir+(string)dir;
    //strupr((char*) check());
    char*mask=".txt .htm .html .php";
    char* form,*end;
    int flag=0;
    string dir1=mask;
    form = new char [dir1.size()+1];
    strcpy (form, mask);
    end = strtok(form," ");
        while  (end !=NULL)
        {
        if(check.find((string)end)!=string::npos) flag=1;//файл
        end = strtok(NULL," ");
        }
    if(flag==1) return 1;
    else return 0;
}

Автор: zim22 13.3.2009, 19:02
Miyka, вариант с использованием STL
Код
#include <string>
#include <algorithm>

void tolower_func(char &c)
{
    c = tolower(c);
}

bool isExtensionCorrect(const std::string &name)
{    
    std::string extensions[] = {"txt", "zip", "rar", "djvu"};        
    size_t arr_size = sizeof(extensions) / sizeof(*extensions);

    std::string::size_type pos = name.find_last_of(".");

    std::string find_str = name.substr(pos + 1, name.size());
    std::for_each(find_str.begin(), find_str.end(), tolower_func);
    
    if (pos != std::string::npos)    
    {
        if (extensions + arr_size != std::find(extensions, extensions + arr_size, find_str))
            return true;
    }
    return false;
}


int main(int argc, char *argv[])
{
    std::string name = "C:\\Program Files\\1.tXt";    
    bool res = isExtensionCorrect(name);    

    return 0;
}

Автор: andrew_121 13.3.2009, 19:05
Miyka, Покажи декларацию StartDir.

Добавлено @ 19:18
Вот я все понимаю, но какая гарантия того что, директория не может называться readme.txt ?
Вот:
Код

bool is_dir_name( const String& str ) {
    return GetFileAttributes( str ) & FILE_ATTRIBUTE_DIRECTORY;
}

bool is_file_name( const String& str ) {
    return !( GetFileAttributes( str ) & FILE_ATTRIBUTE_DIRECTORY );
}


Автор: Miyka 13.3.2009, 19:27
Короче я понял, значит есть TreeView, через него открывается файлег.
Код

char* StartDir="C:\\";

char* dir это ИмяФайла, то есть то что мы жмакаем в ТриВью.
Смысл сей функции понять файл или папка, файлы нужно выбрать с нужным мне расширением, но столкнулся с тем что он не понимает если написано расширение заглавными буквами.
Дальше происходит следующее:
Код

tvi.pszText=FileName;
if(!FileOrFolder(tvi.pszText))
{
    flag=ChangeDirectory(tvi.pszText); // изменение директории
        /*...*/        
}

эээ...

Автор: andrew_121 13.3.2009, 19:34
Miyka, По ходу... тебе в другой раздел. Хотя...

Автор: Miyka 13.3.2009, 19:37
куда в другой раздел?

Автор: inside_pointer 13.3.2009, 20:11
Цитата(Miyka)

Как сделать так что бы проге было все ровно каким регистром написано расширение?

нужно копировать его из пути во временный массив, в нём уменьшить все буквы, а потом сравнивать каждое из набора типа "txt php htm html" с ним

нельзя искать в наборе, потому что htm будет выпадать на html (если вдруг htm из списка расширений будет удалено, то оно всё равно продолжит выпадать, так как является частью html)

Автор: Miyka 13.3.2009, 20:37
я запутался
inside_pointer
спасибо за замечание, но smile так как не поулчаетсья ни чего 

zim22
не все понимаю что в 
 
Код
  
    std::string extensions[] = {"txt", "zip", "rar", "djvu"};        
    size_t arr_size = sizeof(extensions) / sizeof(*extensions);
    std::string::size_type pos = name.find_last_of(".");
    std::string find_str = name.substr(pos + 1, name.size());
    std::for_each(find_str.begin(), find_str.end(), tolower_func);


andrew_121
про то что папка может назваться ЫЫЫ.txt не подумал кста
что происходит в твоем коде...?

Автор: zim22 13.3.2009, 22:00
Цитата(Miyka @  13.3.2009,  20:37 Найти цитируемый пост)
не все понимаю что в 

вот тот же код, но в С исполнении. так понятней?
Код
#include <cstring>

bool isExtensionCorrect(const char *str)
{
    const size_t size = 4;
    const char *extension[size] = {"txt", "zip", "rar", "djvu"}; 
    const char *find_str = "zip";
    
    const char **s = extension;    
    while (s != extension + size)
    {
        if (!strcmp(*s, find_str))
            return true;

        ++s;
    }
    return false;
}
int main(int argc,  char *argv[])
{
    const char *str = "C:\\Program Files\\1.txt";
    bool res = isExtensionCorrect(str);

    return 0;
}




Автор: Rififi 13.3.2009, 22:07
функцию isExtensionCorrect можно подсократить:
Код
bool isExtensionCorrect(const char*)
{ return true; }

:gigi:

Автор: inside_pointer 13.3.2009, 22:47
вот пример: ищёт расширение, если оно есть проводит поиск среди зарегистрированных, выводит пути с  найденными

update:
чуть поправил комменты, и расширил список расширений, а, ну и ещё доработал функцию, которая отрезает и преобразовывает расширение, чтобы C:\Temp\file. яснее обрабатывалось; а определять, файл это или папка, можно путём открытия папки как файла и проверки кода ошибки через errno

Автор: Miyka 16.3.2009, 18:04
сорри но что у мну не получаеться прикрутить к моей программе. Я ЛОЛ. Спасибо за советы.

Автор: inside_pointer 16.3.2009, 20:54
бинарный поиск позволяет не перебирать все элементы, а находить нужный в два три шага (на данном множестве), а просто поиск можно заюзать, чтобы расширение отделить для преобразования

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)