Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «БистСмноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² срСдС WindowsΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 42

Автор ДТонсон Π₯Π°Ρ€Ρ‚

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ

Как ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… случаях ΠΌΠ΅Ρ‚ΠΎΠ΄ отобраТСния Ρ„Π°ΠΉΠ»ΠΎΠ² являСтся вСсьма ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ. Однако ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ создаСтся структура Π΄Π°Π½Π½Ρ‹Ρ… с указатСлями, ΡΡΡ‹Π»Π°ΡŽΡ‰ΠΈΠΌΠΈΡΡ Π½Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ отобраТСния Ρ„Π°ΠΉΠ»Π°, ΠΈ оТидаСтся, Ρ‡Ρ‚ΠΎ впослСдствии ΠΊ этому Ρ„Π°ΠΉΠ»Ρƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅. Π’ этом случаС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ установлСнными ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ адрСса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ MapViewOfFile, ΠΈ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ смысла ΠΏΡ€ΠΈ использовании прСдставлСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° отобраТСния Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π·. РСшСниС состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ (based pointers), ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ фактичСски смСщСниями ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ указатСля. Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ синтаксис Microsoft Π‘, доступный Π² Visual C++ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄Ρ€ΡƒΠ³ΠΈΡ… систСмах, выглядит ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Ρ‚ΠΈΠΏ _based (Π±Π°Π·Π°) объявлСниС

НиТС ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π΄Π²Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Ρ‚Π°ΠΊΠΈΡ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ.

LPTSTR pInFile = NULL;

DWORD _based (pInFile) *pSize;

TCHAR _based (pInFile) *pIn;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎΡ‚ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ синтаксис Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ использования символа *, хотя такая ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ° ΠΏΡ€ΠΎΡ‚ΠΈΠ²ΠΎΡ€Π΅Ρ‡ΠΈΡ‚ соглашСниям Windows.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€: использованиС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

РассмотрСнныС Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΎΡ‚Π½ΠΎΡΠΈΠ»ΠΈΡΡŒ ΠΊ сортировкС Ρ„Π°ΠΉΠ»ΠΎΠ² Π² Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ситуациях. ВмСстС с Ρ‚Π΅ΠΌ, Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ наша Ρ†Π΅Π»ΡŒ состояла Π½Π΅ Π² обсуТдСнии ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΈΠΊ сортировки, Π° Π² дСмонстрации примСнСния Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² управлСния ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 5.1 ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ΅ Π΄Π΅Ρ€Π΅Π²ΠΎ поиска, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ уничтоТаСтся ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ ΠΊ сортировкС ΠΎΡ‡Π΅Ρ€Π΅Π΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 5.4 сортируСтся массив фиксированных записСй, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½Ρ‹ΠΉ Π² памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Π’ прСдставлСны ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΈ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.5. 

ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ сопровоТдСниС постоянно ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ индСксного Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ отсортированный ΠΊΠ»ΡŽΡ‡ исходного Ρ„Π°ΠΉΠ»Π°. Могло Π±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ являСтся ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² памяти Ρ„Π°ΠΉΠ»Π°, содСрТащСго постоянно Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Π΅ индСксы Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° поиска, ΠΈΠ»ΠΈ Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΌΡ‹ с отсортированным ΠΊΠ»ΡŽΡ‡ΠΎΠΌ. Однако это Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ страдаСт ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹ΠΌ нСдостатком. ВсС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π΄Π΅Ρ€Π΅Π²Π°, сохраняСмыС Π² Ρ„Π°ΠΉΠ»Π΅, ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ адрСса, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ MapViewOfFile. Когда ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π· ΠΈ создаст ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°, эти ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ окаТутся бСсполСзными.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.5, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ совмСстно с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ 5.6, Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, которая проявляСтся всякий Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ структуры Π΄Π°Π½Π½Ρ‹Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π’ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово _based, прСдоставляСмоС Microsoft Π‘. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° Π² массив ΠΈ обСспСчСниС доступа ΠΊ записям Π² прСдставлСнии ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° отобраТСния Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ индСкса.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° написана Π² Π²ΠΈΠ΄Π΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΉ вСрсии ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ sort, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС присвоСно имя sortMM. Данная вСрсия ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ отличаСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌΠΈ особСнностями, Π·Π°ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ внимания:

β€’ Π—аписи ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Π΄Π»ΠΈΠ½Ρƒ.

β€’ ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Π² качСствС ΠΊΠ»ΡŽΡ‡Π°, Π½ΠΎ опрСдСляСт Π΅Π³ΠΎ Π΄Π»ΠΈΠ½Ρƒ.

β€’ Бтроятся Π΄Π²Π° прСдставлСния Ρ„Π°ΠΉΠ»Π°. Одно ΠΈΠ· Π½ΠΈΡ… прСдставляСт исходный Ρ„Π°ΠΉΠ», Π° Π²Ρ‚ΠΎΡ€ΠΎΠ΅ β€” Ρ„Π°ΠΉΠ», содСрТащий отсортированныС ΠΊΠ»ΡŽΡ‡ΠΈ. Π’Ρ‚ΠΎΡ€ΠΎΠΉ Ρ„Π°ΠΉΠ» являСтся индСксным Ρ„Π°ΠΉΠ»ΠΎΠΌ (index file), каТдая ΠΈΠ· записСй ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ содСрТит ΠΊΠ»ΡŽΡ‡ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ (Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ адрСс), относящийся ΠΊ исходному Ρ„Π°ΠΉΠ»Ρƒ. Для сортировки индСксного Ρ„Π°ΠΉΠ»Π°, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ ΠΏΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΠΈ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ 5.4, примСняСтся функция qsort.

β€’ Π˜Π½Π΄Π΅ΠΊΡΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» сохраняСтся ΠΈ впослСдствии ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ прСдусмотрСна Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки –I) ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ сортировки ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ индСксный Ρ„Π°ΠΉΠ». ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, индСксный Ρ„Π°ΠΉΠ» ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован для быстрого поиска ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΏΡƒΡ‚Π΅ΠΌ провСдСния Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ поиска (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, с использованиСм входящСй Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ C Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ bsearch) Π² индСксном Ρ„Π°ΠΉΠ»Π΅.

Π’Π·Π°ΠΈΠΌΠΎΡΠ²ΡΠ·ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ индСксным Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈ сортируСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ рис. 5.5. Π“Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.5, которая обСспСчиваСт созданиС прСдставлСний Ρ„Π°ΠΉΠ»ΠΎΠ² Π² памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°, осущСствляСт сортировку индСксного Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateIndexFile, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»Π΅Π½Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ 5.6. 

Рис. 5.5. Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° с использованиСм отобраТСния индСксного Ρ„Π°ΠΉΠ»Π°


ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.5. sortMM: использованиС Π±Π°Π·ΠΎΠ²Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² индСксном Ρ„Π°ΠΉΠ»Π΅ 

/* Π“Π»Π°Π²Π° 5. Команда sortMM.

 Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²ΠΊΠ° ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π² памяти Ρ„Π°ΠΉΠ»Π° – Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ». ΠžΠΏΡ†ΠΈΠΈ:

 -r Π‘ΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС.

 -I Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ индСксный Ρ„Π°ΠΉΠ» для получСния отсортированного Ρ„Π°ΠΉΠ»Π°. */

#include "EvryThng.h"


int KeyCompare(LPCTSTR , LPCTSTR);

DWORD CreateIndexFile (DWORD, LPCTSTR, LPTSTR);

DWORD KStart, KSize; /* ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ позиция ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ»ΡŽΡ‡Π° (TCHAR) . */

BOOL Revrs;


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

 HANDLE hInFile, hInMap; /* ДСскрипторы Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. */

 HANDLE hXFile, hXMap; /* ДСскрипторы индСксного Ρ„Π°ΠΉΠ»Π°. */

 HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

 BOOL IdxExists;

 DWORD FsIn, FsX, RSize, iKey, nWrite, *pSizes;

 LPTSTR pInFile = NULL;

 LPBYTE pXFile = NULL, pX;

 TCHAR _based(pInFile) *pIn; 

 TCHAR IdxFlNam [MAX_PATH], ChNewLine = TNEWLINE;

 int FlIdx = Options(argc, argv, _T("rI"), &Revrs, &IdxExists, NULL);

 /* Π¨Π°Π³ 1: ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ». */

 hInFile = CreateFile(argv [FlIdx], GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

 hInMap = CreateFileMapping(hInFile, NULL, PAGE_READWRITE, 0, 0, NULL);

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

 FsIn = GetFileSize(hInFile, NULL);

 /* Π¨Π°Π³ΠΈ 2 ΠΈ Π—: ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ имя индСксного Ρ„Π°ΠΉΠ»Π°. */

 _stprintf(IdxFlNam, _T("%s%s"), argv[FlIdx], _T(".idx"));

 if (!IdxExists) RSize = CreateIndexFile(FsIn, IdxFlNam, pInFile);

 /* Π¨Π°Π³ 4: ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ индСксный Ρ„Π°ΠΉΠ». */

 hXFile = CreateFile(IdxFlNam, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);

 hXMap = CreateFileMapping(hXFile, NULL, PAGE_READWRITE, 0, 0, NULL);

 pXFile = MapViewOfFile(hXMap, FILE_MAP_ALL_ACCESS, 0, 0, 0);

 FsX = GetFileSize(hXFile, NULL);

 pSizes = (LPDWORD)pXFile; /* Поля Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Π² .idx-Ρ„Π°ΠΉΠ»Π΅. */

 KSize = *pSizes; /* Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ»ΡŽΡ‡Π° */

 KStart = *(pSizes + 1); /* ΠΠ°Ρ‡Π°Π»ΡŒΠ½Π°Ρ позиция ΠΊΠ»ΡŽΡ‡Π° Π² записи. */

 FsX –= 2 * sizeof(DWORD);

 /* Π¨Π°Π³ 5: ΡΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ индСксный Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ qsort. */

 if (!IdxExists) qsort(pXFile + 2 * sizeof(DWORD), FsX / RSize, RSize, KeyCompare);

 /* Π¨Π°Π³ 6: ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» Π² отсортированном Π²ΠΈΠ΄Π΅. */

 Ρ€Π₯ = pXFile + 2 * sizeof(DWORD) + RSize – sizeof(LPTSTR);

 for (iKey = 0; iKey < FsX / RSize; iKey++) {

  WriteFile(hStdOut, &ChNewLine, TSIZE, &nWrite, NULL);

  /* ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° Ρ€Π₯, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ! */

  pIn = (TCHAR _based (pInFile)*) *(LPDWORD)pX;

  while ((*pIn != CR || * (pIn + 1) != LF) && (DWORD) pIn < FsIn) {

   WriteFile(hStdOut, pIn, TSIZE, &nWrite, NULL); pIn++;

  }

  Ρ€Π₯ += RSize;

 }

 UnmapViewOfFile(pInFile);

 CloseHandle(hInMap);

 CloseHandle(hInFile);

 UnmapViewOfFile(pXFile);

 CloseHandle(hXMap);

 CloseHandle(hXFile);

 return 0;

}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.6 прСдставляСт собой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ CreateIndexFile,  Ρ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ создаСтся индСксный Ρ„Π°ΠΉΠ». Π‘Π½Π°Ρ‡Π°Π»Π° ΠΎΠ½Π° просматриваСт Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» для опрСдСлСния Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΊΠ»ΡŽΡ‡Π° ΠΏΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ записи. ПослС этого ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» для нахоТдСния Π³Ρ€Π°Π½ΠΈΡ† ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· записСй ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹ для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ структуры, прСдставлСнной Π½Π° рис. 5.5.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 5.6. sortMM: созданиС индСксного Ρ„Π°ΠΉΠ»Π° 

DWORD CreateIndexFile(DWORD FsIn, LPCTSTR IdxFlNam, LPTSTR pInFile) {

 HANDLE hXFile;

 TCHAR _based (pInFile) *pInScan = 0;

 DWORD nWrite;

 /* Π¨Π°Π³ 2Π°: ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ индСксный Ρ„Π°ΠΉΠ». НС ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ Π΅Π³ΠΎ Π½Π° Π΄Π°Π½Π½ΠΎΠΉ стадии. */

 hXFile = CreateFile(IdxFlNam, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);

 /* Π¨Π°Π³ 2b: ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ. ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π΄Π»ΠΈΠ½Ρƒ ΠΊΠ»ΡŽΡ‡Π°. */

 KStart = (DWORD) pInScan;

 while (*pInScan != TSPACE && *pInScan != TAB) pInScan++; /* Найти ΠΏΠΎΠ»Π΅ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΊΠ»ΡŽΡ‡Π°. */

 KSize = ((DWORD)pInScan – KStart) / TSIZE;

 /* Π¨Π°Π³ 3: ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ вСсь Ρ„Π°ΠΉΠ», записывая ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ записСй Π² индСксный Ρ„Π°ΠΉΠ». */

 WriteFile(hXFile, &KSize, sizeof(DWORD) , &nWrite, NULL);

 WriteFile(hXFile, &KStart, sizeof(DWORD), &nWrite, NULL);

 pInScan = 0;

 while ((DWORD)pInScan < FsIn) {

  WriteFile(hXFile, pInScan + KStart, KSize * TSIZE, &nWrite, NULL);

  WriteFile(hXFile, &pInScan, sizeof(LPTSTR), &nWrite, NULL);

  while ((DWORD)pInScan < FsIn && ((*pInScan != CR) || (*(pInScan + 1) != LF))) {

   pInScan++; /* ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π° строки. */

  }

  pInScan += 2; /* ΠŸΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ CR, LF. */

 }

 CloseHandle(hXFile);

 /* Π Π°Π·ΠΌΠ΅Ρ€ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ записи. */

 return KSize * TSIZE + sizeof(LPTSTR);