Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2010, 22:35   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Поиск максимально приближенного файла

Доброго времени суток уважаемые эксперты, возникли трудности в решении одной задачи, просьба помочь. Есть алгоритмик находящий файл по имени в директории где находится .(формат файла) файл,
собственно что-то обширней мне ничего не нужно, этого достаточно.
По точному слову файла, алгоритм без проблем находит требуемое, иначе выдает мессагу о не найденном файле.
Собственно мне нужно реализовать, чтобы алгоритм при не положительном условии находил как можно приближенный по имени файл к заданному файлу, иначе даже если максимально приближенных файлов не существует, выдаем мессагу о том что файла нема.
Помогите пожалуйста расхлебать задачку, реально не одной идеи в голову не лезет.

За ранее благодарен за любую помощь

Код:
void CFunction::PCSearchFile()
{ SearchMark:
    printf("[SEARCH FILE]\n Name: -> ");
    gets(STRF.STSearchFile);

    if (strlen(STRF.STSearchFile) > szCHAR)
    { MessageBoxA(NULL, "The file name exceeds limit of char!", "Error!", MB_OK); _asm { jmp SearchMark } }

    TSearchRec SearchRec;

    int fCount = 0;

    if ( GetCurrentDirectoryA(sizeof(szPATH), szPATH) )
    { printf("\n[%s]\n\n", szPATH);
        if (FindFirst("*", faAnyFile, SearchRec) == 0)
        {
            do
            { fCount++;
                if (fCount > 2)
                {
                    if (SearchRec.Name == STRF.STSearchFile)
                    { printf("\"%s\" ", SearchRec.Name); }
                    //else { MessageBoxA(NULL, "File not found!", "Error!", MB_OK); break; }
                }
            } while (FindNext(SearchRec) == 0);

            FindClose(SearchRec);
        }
    } printf("\n");
}

Последний раз редактировалось coNsept; 02.05.2010 в 22:44.
coNsept вне форума Ответить с цитированием
Старый 03.05.2010, 02:35   #2
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Такс, надумал следующее.

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

Ваше мнение, в правильную ли сторону я копаю ?
coNsept вне форума Ответить с цитированием
Старый 03.05.2010, 08:27   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

хм... Допустим маска:File1
и попался файл Filrer1
Допустим можно из Filrer1 поудалять буквы неиспользуемые в маске, тогда будет совпадение но мне кажется что это бессмысленная трата времени.
Гораздо удобнее использовать стандартные маски файлов * и ? для отфильтровывания ненужного.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.05.2010, 11:13   #4
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Цитата:
Допустим можно из Filrer1 поудалять буквы неиспользуемые в маске, тогда будет совпадение
Это называется алгоритм нахождения наибольшей общей подпоследовательности. На Вики есть, если что.
Цитата:
Код:
if (strlen(STRF.STSearchFile) > szCHAR)
    { MessageBoxA(NULL, "The file name exceeds limit of char!", "Error!", MB_OK); _asm { jmp SearchMark } }
А зачем тут ассемблерная вставка? Вы не думаете, что проще сделать циклом?
MaTBeu вне форума Ответить с цитированием
Старый 03.05.2010, 12:04   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

знаю что правильней сделать
while (условие)
{ continue; }

но мне больше нравится так как сделал я -)
coNsept вне форума Ответить с цитированием
Старый 03.05.2010, 12:16   #6
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

Правильней сделать
Код:
bool flag = false;
do
{
    //получаете имя файла
    if(currentFileName == FileNameToSeek)
        flag = true;
    else
        //переходим на следующий файл
}
while(!flag);
MaTBeu вне форума Ответить с цитированием
Старый 03.05.2010, 22:13   #7
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Цитата:
Допустим можно из Filrer1 поудалять буквы неиспользуемые в маске, тогда будет совпадение но мне кажется что это бессмысленная трата времени.
Спасибо за идею, идея мне понравилась не смотря на то что она не столь хороша как вторая, но этот вариант для меня проще в реализации.
coNsept вне форума Ответить с цитированием
Старый 24.05.2010, 16:59   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Матвей привет

Вобщем я нашел этот алгоритм наибольшей общей подпоследовательности, но не могу отобразить данные... (как-бы крякозяблы отображает после выполнения этого алгоритма)
Мб дескриптор %s не фунциклирует с string ? (никогда не имел дело cо string'ом)

Код:
void Execute::TSearchFile()
{
	HANDLE hStdout;
	WIN32_FIND_DATAA FindFile;
	hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

	printf("[SEARCH FILE]\n Name: "); gets(wwf.lpSearchFile); printf("\n");

	if (strlen(wwf.lpSearchFile) > szCHAR)
	{ MessageBoxA(NULL, "The file name exceeds limit of char!", "Error!", MB_OK); }

	char *File = "\\*.*";
	
	if ( GetCurrentDirectoryA(sizeof(szPATH), szPATH) )
	{  
		lstrcatA(szPATH, File);

		HANDLE hFile = FindFirstFileA(szPATH, &FindFile);

		if (hFile != INVALID_HANDLE_VALUE)
		{
			do
			{
				if ( strcmp(wwf.lpSearchFile, FindFile.cFileName) == 0 )
				{ printf("Required file -> %s\n", FindFile.cFileName); }
				else 
				{ printf("Similar file - >%s\n", LongestCommonSubsequence(wwf.lpSearchFile, FindFile.cFileName)); }
			}
			while ( FindNextFileA(hFile, &FindFile) != 0 ); 		
	    }
		FindClose(hFile);
	}

	printf("\n"); this->TSelect();
}

// Wikipedia.org - Наибольшая общая подпоследовательность
std::string Execute::LongestCommonSubsequence(const std::string& a, const std::string& b)
{
	std::vector<std::vector<int> > max_len;
    max_len.resize(a.size() + 1);
    
	for(int i = 0; i <= (int)a.size(); i++)
		max_len[i].resize(b.size() + 1);
        
	for(int i = (int)a.size() - 1; i >= 0; i--)
    {
		for(int j = (int)b.size() - 1; j >= 0; j--)
        {
			if(a[i] == b[j])
			{
				max_len[i][j] = 1 + max_len[i + 1][j + 1];
            }
			else
			{
				max_len[i][j] = max(max_len[i + 1][j], max_len[i][j + 1]);
			}
		}
	}

	std::string Res;

    for (int i = 0, j = 0; max_len[i][j] != 0 && i < (int)a.size() && j<(int)b.size(); )
	{
		if (a[i] == b[j])
		{
			Res.push_back(a[i]); i++; j++;
		}
		else
		{
			if(max_len[i][j] == max_len[i + 1][j])
			{ i++; }
            else
			{ j++; }
		}
	}
	return Res;
}

Последний раз редактировалось coNsept; 24.05.2010 в 17:19.
coNsept вне форума Ответить с цитированием
Старый 25.05.2010, 22:48   #9
MaTBeu
Eclipse Foundation
Старожил
 
Аватар для MaTBeu
 
Регистрация: 19.09.2007
Сообщений: 2,604
По умолчанию

У класса std::string есть метод с_str(), который возвращает строку типа char *. Вот с ним можно работать в printf и подобных ей функциях.
MaTBeu вне форума Ответить с цитированием
Старый 26.05.2010, 17:28   #10
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Неа, без изменений
coNsept вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файла plusstick Microsoft Office Access 4 22.02.2010 11:09
Roverbook & Linux, Мандрива или Сусе, как максимально удалить лишние пакеты? =инет+mp3+апач bush007 Linux (Ubuntu, Debian, Red Hat, CentOS, Mint) 70 30.06.2009 13:46
поиск файла Mihailhome Общие вопросы Delphi 1 25.05.2009 18:03
Поиск файла Cpluser Общие вопросы C/C++ 4 03.03.2009 11:30
Задача: заполнение плоскости объектами, максимально плотно rosi4 Помощь студентам 1 15.11.2008 13:42