Member 12899279 Ответов: 3

Как сопоставить, если пути к файлам уже присутствуют в txt-файле перед записью в тот же txt-файл


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


Теперь я знаю, что могу использовать eof для получения файлов из текстового файла, а затем сопоставить их с путем, который я восстановил, но я не могу придумать никакой логики

Что я уже пробовал:

Я думал об этом но он соответствует только первой строке текстового файла и после сопоставления он не пишет но после этого функция getfil currFile не меняется поэтому он не работает
string str;
					do {
						while (getline(read, str))
						{
							if (str != currFile)
							{	//if(()
								file <</*counter<<"-"<< */"\n"<<currFile << endl;
								counter++;

							}
							else if (str == currFile)
							{
								break;
							}
							break;

						}
					} while (!read.eof());

3 Ответов

Рейтинг:
2

CPallini

Использовать std::set Люк, используй ... std::set!

Используйте set чтобы сохранить путь к уже найденным файлам (тем, которые присутствуют в вашем txt-файле).
Затем, во время поиска, вставьте найденные файлы в то же самое место. set.
В конечном счете храните set содержимое в исходный текстовый файл (перезапись).


Member 12899279

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

CPallini

Попробуйте вместо этого использовать std::set.

Member 12899279

причина?

CPallini

Поскольку вам не нужно проверять наличие дубликатов, это автоматически обрабатывается самой структурой данных.

Member 12899279

да я читал об этом но если рассматривать скорость то вектор значительно лучше

Рейтинг:
1

k5054

Это похоже на место, где можно использовать СТД::набор - cppreference.com[^] Вам все равно нужно просмотреть весь файл на предмет совпадений, так почему бы не прочитать весь файл в начале вашей программы, поместив каждую строку в std::set<string> Затем, когда вы найдете свои спички, позвоните find(). Если он вернется end(), то вы знаете, что его нет в наборе, поэтому вам нужно добавить имя файла в файл уже сопоставленных файлов. Если вы не считаете, что есть хороший шанс, что ваш алгоритм поиска диска найдет один и тот же файл несколько раз, вам не нужно добавлять этот файл в набор.

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

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


Рейтинг:
0

Richard MacCutchan

Там много избыточного кода:

int getfil(void *args) // why are you using void* and not char* ?
{
    char *tmpPath = (char *)args; // why not just use the input argument ?
    string sPath(tmpPath);
    WIN32_FIND_DATA FindFileData;
    string sTmpPath = sPath; // why are you creating a copy of sPath ?
    sTmpPath += "\\*.*";

// a neater way ...
int getfil(char *sourcePath)
{
    WIN32_FIND_DATA FindFileData;
    string sTmpPath = sourcePath;
    sTmpPath += "\\*.*";