Чтение онлайн

на главную - закладки

Жанры

Системное программирование в среде Windows

Харт Джонсон М.

Шрифт:

 LPSTR pIn, pInFile;

 LPWSTR pOut, pOutFile;

 DWORD FsLow, dwOut;

 /* Открыть и отобразить входной и выходной файлы. */

 hIn = CreateFile(fIn, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 hInMap = CreateFileMapping(hIn, NULL, PAGE_READONLY, 0, 0, NULL);

 pInFile = MapViewOfFile(hInMap, FILE_MAP_READ, 0, 0, 0);

 dwOut = bFailIfExists ? CREATE NEW : CREATE ALWAYS; 

 hOut = CreateFile(fOut, GENERIC_READ | GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);

 FsLow = GetFileSize (hIn, NULL); /*
Установить размер отображения. */

 hOutMap = CreateFileMapping(hOut, NULL, PAGE_READWRITE, 0, 2* FsLow, NULL);

 pOutFile = MapViewOfFile(hOutMap, FILE_MAP_WRITE, 0, 0, (SIZE_T)(2 * FsLow));

 /* Преобразовать данные отображенного файла из ASCII в Unicode. */

 pIn = pInFile;

 pOut = pOutFile;

 while (pIn < pInFile + FsLow) {

*pOut = (WCHAR) *pIn;

pIn++;

pOut++;

 }

 UnmapViewOfFile(pOutFile);

 UnmapViewOfFile(pInFile);

 CloseHandle(hOutMap);

 CloseHandle(hInMap);

 CloseHandle(hIn);

 CloseHandle(hOut);

 return TRUE;

}
 

Пример: сортировка отображенных файлов

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

Программа 5.4 предназначена для сортировки файлов с записями фиксированной длины. Данная программа, sortFL, аналогична программе 5.1 в том отношении, что предполагает наличие 8-байтового ключа сортировки в начале записи, но ограничивается записями фиксированной длины. В программе 5.5 этот недостаток будет устранен за счет некоторого усложнения программы.

Сортировку выполняет описанная в файле <stdlib.h> функция qsort, входящая в состав библиотеки С. Заметьте, что эта функции требует от программиста предоставления функции, осуществляющей сравнение записей, в качестве которой нами будет использована функция KeyCompare из программы 5.2.

Структура программы достаточно проста. Сначала на основе временной копии входного файла создается объект отображения файла, затем создается единое представление объекта отображения файла в памяти, и, наконец, вызывается функция qsort. При этом какие-либо операции файлового ввода/вывода отсутствуют. Отсортированный файл направляется далее на стандартный вывод, причем в конце отображения файла добавляется нулевой символ. 

Программа 5.4. sortFL: сортировка файла с использованием его отображения в памяти 

/*
Глава 5. sortFL. Сортировка файлов. Записи имеют фиксированную длину.*/

/* Использование: sortFL файл */

#include "EvryThng.h"

typedef struct _RECORD {

 TCHAR Key[KEY_SIZE];

 TCHAR Data[DATALEN];

} RECORD;

#define RECSIZE sizeof(RECORD)

int _tmain(int argc, LPTSTR argv[]) {

 HANDLE hFile = INVALID_HANDLE_VALUE, hMap = NULL;

 LPVOID pFile = NULL;

 DWORD FsLow, Result = 2;

 TCHAR TempFile[MAX_PATH];

 LPTSTR pTFile;

 /* Создать имя временного файла, предназначенного для хранения копии сортируемого файла, которая и подвергается сортировке. */

 /* Можно действовать и по-другому, оставив файл в качестве постоянно хранимой сортируемой версии. */

 _stprintf(TempFile, _T("%s%s"), argv[1], _Т(".tmp"));

 CopyFile(argv[1], TempFile, TRUE);

 Result = 1; /* Временный файл является вновь созданным и должен быть удален. */

 /* Отобразить временный файл и выполнить его сортировку в памяти. */

 hFile = CreateFile(TempFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

 FsLow = GetFileSize(hFile, NULL);

 hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, FsLow + TSIZE, NULL);

 pFile = MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0 /* FsLow + TSIZE */, 0);

 qsort(pFile, FsLow / RECSIZE, RECSIZE, KeyCompare);

 /* KeyCompare – как в программе 5.2. */

 /* Отобразить отсортированный файл. */

 pTFile = (LPTSTR)pFile;

 pTFile[FsLow/TSIZE] = '\0';

 _tprintf(_T("%s"), pFile);

 UnmapViewOfFile(pFile);

 CloseHandle(hMap);

 CloseHandle(hFile);

 DeleteFile(TempFile);

 return 0;

}
 

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

Поделиться:
Популярные книги

Черный Маг Императора 6

Герда Александр
6. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
7.00
рейтинг книги
Черный Маг Императора 6

Оцифрованный. Том 1

Дорничев Дмитрий
1. Линкор Михаил
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Оцифрованный. Том 1

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Штуцер и тесак

Дроздов Анатолий Федорович
1. Штуцер и тесак
Фантастика:
боевая фантастика
альтернативная история
8.78
рейтинг книги
Штуцер и тесак

Я снова граф. Книга XI

Дрейк Сириус
11. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я снова граф. Книга XI

Болотник

Панченко Андрей Алексеевич
1. Болотник
Фантастика:
попаданцы
альтернативная история
6.50
рейтинг книги
Болотник

Кодекс Крови. Книга III

Борзых М.
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга III

Жестокая свадьба

Тоцка Тала
Любовные романы:
современные любовные романы
4.87
рейтинг книги
Жестокая свадьба

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Голодные игры

Коллинз Сьюзен
1. Голодные игры
Фантастика:
социально-философская фантастика
боевая фантастика
9.48
рейтинг книги
Голодные игры

Последняя Арена 8

Греков Сергей
8. Последняя Арена
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Последняя Арена 8

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Измена. Свадьба дракона

Белова Екатерина
Любовные романы:
любовно-фантастические романы
эро литература
5.00
рейтинг книги
Измена. Свадьба дракона