Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как избежать регистра при проверке расшиерния? название было не сформулировать( 
:(
    Опции темы
Miyka
  Дата 13.3.2009, 17:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



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

Код

    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;

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

PM MAIL ICQ   Вверх
andrew_121
Дата 13.3.2009, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Miyka
Дата 13.3.2009, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Гениально!!! Щас поработаю над этим.

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

Это сообщение отредактировал(а) Miyka - 13.3.2009, 17:59
PM MAIL ICQ   Вверх
Miyka
Дата 13.3.2009, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



нет, не понятно т.к. не работает.

Код

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

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



не понимаю....
Еще вопрос: адекватно ли использовать такой метод проверки?
PM MAIL ICQ   Вверх
andrew_121
Дата 13.3.2009, 18:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Miyka
Дата 13.3.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Код

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

PM MAIL ICQ   Вверх
zim22
Дата 13.3.2009, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



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



--------------------
PM MAIL   Вверх
andrew_121
Дата 13.3.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



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



Это сообщение отредактировал(а) andrew_121 - 13.3.2009, 19:19


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Miyka
Дата 13.3.2009, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



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

char* StartDir="C:\\";

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

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

эээ...
PM MAIL ICQ   Вверх
andrew_121
Дата 13.3.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Miyka, По ходу... тебе в другой раздел. Хотя...


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Miyka
Дата 13.3.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



куда в другой раздел?
PM MAIL ICQ   Вверх
inside_pointer
Дата 13.3.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 344
Регистрация: 9.3.2008

Репутация: 5
Всего: 12



Цитата(Miyka)

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

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

нельзя искать в наборе, потому что htm будет выпадать на html (если вдруг htm из списка расширений будет удалено, то оно всё равно продолжит выпадать, так как является частью html)
PM MAIL   Вверх
Miyka
Дата 13.3.2009, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 20
Регистрация: 22.3.2008
Где: Санкт-Петербург

Репутация: нет
Всего: нет



я запутался
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 не подумал кста
что происходит в твоем коде...?
PM MAIL ICQ   Вверх
zim22
Дата 13.3.2009, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 24
Всего: 69



Цитата(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;
}






--------------------
PM MAIL   Вверх
Rififi
Дата 13.3.2009, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



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

:gigi:
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1287 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.