首页 > 技术文章 > 使用内存映射来对文件排序

duyy 2014-04-21 17:56 原文

#include"stdafx.h"
#include <windows.h>


#define DATALEN 56
#define KEY_SIZE 8

typedef struct _RECORD {
    TCHAR key[KEY_SIZE];
    TCHAR data[DATALEN];
} RECORD;

#define RECSIZE sizeof (RECORD)


int Comp(const void *p1,const void *p2)
{
  return _tcsncmp ((LPCSTR)p1, (LPCTSTR)p2, KEY_SIZE);
}


int _tmain (int argc, LPTSTR argv[])
{
    HANDLE hFile=INVALID_HANDLE_VALUE,hMap=NULL;
    LPVOID pFile=NULL;
    LARGE_INTEGER fileSize;
    TCHAR tempFile[MAX_PATH];
    LPTSTR pTFile;
    
    CopyFileA("e:\\large.txt",tempFile,TRUE);

    hFile=CreateFile(tempFile,GENERIC_READ|GENERIC_WRITE,
                    0,NULL,OPEN_EXISTING,0,NULL);
    GetFileSizeEx(hFile,&fileSize);
    fileSize.QuadPart+=2;
    hMap=CreateFileMapping(hFile,NULL,PAGE_READWRITE,fileSize.HighPart,fileSize.LowPart,NULL);
    pFile=MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);

    qsort(pFile,(SIZE_T)fileSize.QuadPart / RECSIZE,RECSIZE,Comp);

    pTFile=(LPTSTR)pFile;
    pTFile[fileSize.QuadPart]='\0';
    _tprintf(_T("%s"),pFile);
    UnmapViewOfFile(pFile);
    CloseHandle(hMap);
    DeleteFile(tempFile);

    system("pause");
    return 0;
}

待排序内容格式如下:

部分排序结果如下:

 

推荐阅读