ΠΠ°Π·ΠΎΠ²ΡΠ΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ
ΠΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΡ, Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΌΠ° ΡΠ΄ΠΎΠ±Π½ΡΠΌ. ΠΠ΄Π½Π°ΠΊΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠΎΠ·Π΄Π°Π΅ΡΡΡ ΡΡΡΡΠΊΡΡΡΠ° Π΄Π°Π½Π½ΡΡ Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΡΠΌΠΈ, ΡΡΡΠ»Π°ΡΡΠΈΠΌΠΈΡΡ Π½Π° ΠΎΠ±Π»Π°ΡΡΡ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠ°ΠΉΠ»Π°, ΠΈ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΡΡ, ΡΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΈ ΠΊ ΡΡΠΎΠΌΡ ΡΠ°ΠΉΠ»Ρ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡΡ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΡΠΌΠΈ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ Π°Π΄ΡΠ΅ΡΠ°, Π²ΠΎΠ·Π²ΡΠ°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ 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. ΠΠΎΠΌΠ°Π½Π΄Π° 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);
}