Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #74, ФЕВРАЛЬ 2005 г.

Файлы в ассортименте

Диман Dr.X (xdiman@mail.ru)

Хакер, номер #074, стр. 074-108-3


Создание алгоритма сортировки

Для начала следует разобраться с системой хранения критериев для сортировки. Объявим ассоциативный контейнер для сортировки по расширению и массив из четырех контейнеров, каждый элемент которого будет служить для сортировки по подкаталогам для четырех основных типов файлов:

map<string, string> sortExt;

map<string, string> sortTypes [4];

Наш сортировщик будет иметь модульное строение. Создадим специальные модули для заполнения структуры критериев, для самодополнения, а также отдельный модуль для самой сортировки.

Заполнение структуры критериев

Написание данного модуля сводится к сканированию всех подкаталогов, нахождению файлов со списками критериев и добавлению их в ассоциативные контейнеры. Поэтому помимо основных файлов, содержащих критерии для сортировки, следует создать файл, который будет содержать их имена без расширений. Назовем его index.ims.

При запуске модуля будет открываться этот файл, лежащий в корневой директории, а затем будут считаны и обработаны все файлы, содержащие критерии для сортировки по расширению. На втором этапе будут просканированы все подкаталоги для основных типов файлов, а также будет выполнена процедура, аналогичная первой. В ассоциативных контейнерах используется тип string для хранения данных, поэтому для ввода из файлов будем использовать удобные стандартные потоки fstream. Для начала запустим основной цикл:

string second; int i=0;

ifstream secdir; string maindir;

ifstream typeindex("index.ims");

// Основной цикл в корневой директории

while (!typeindex.eof()) {

// Определяем название первого основного типа

typeindex >> maindir;

...

// Счетчик цикла инкрементируется

i++;

}

Здесь с каждым новым витком цикла из файла считывается название какой-либо главной категории, а затем заполняется главный ассоциативный контейнер. Переменная-счетчик i служит для обращения к нужному элементу массива ассоциативных контейнеров. Создадим вложенный цикл, в котором будем читать данные из файла с критериями первичной сортировки по расширению, на лету помещая их в контейнер:

// Получаем имя файла с критериями сортировки

ifstream msl;

string reason;

maindir += ".msl";

// Открываем файл с критериями для чтения

msl.open(maindir.c_str());

maindir.erase(maindir.length()-4, 4);

// Считываем критерии сортировки из файла

while (!msl.eof()) {

msl >> reason;

sortExt[reason] = maindir;

}

msl.close();

msl.clear();

Лучше всего заключить данный код в отдельную функцию и вызывать по мере необходимости. Затем следует произвести сканирование подкатегорий, аналогичное данному. Это достигается путем использования вложенного цикла, только считывание в данном случае будет осуществляться в переменную second. После окончательного написания модуля подключай заголовочный файл и приступай к созданию следующего.

Модуль сортировки файлов

Назад на стр. 074-108-2  Содержание  Вперед на стр. 074-108-4