• windows内存映射文件


    http://shushanyegui.duapp.com/?p=731

    在描述内存映射文件之前 我们先来写一个系统通过I/O来读写磁盘文件的小程序

    #include "stdafx.h"
    #include <stdlib.h>
    #include <windows.h>
    
    char* Read(LPCWSTR file)
    {
        HANDLE hFile = CreateFile(
            (LPCWSTR)file,
            GENERIC_READ,
            0,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL
            );
        DWORD filesize = GetFileSize(hFile, NULL);
        int size = filesize + 1;
        char *buff = (char *)malloc(sizeof(char)*size);
        for (int i = 0; i<size; i++)
        {
            buff[i] = 0;
        }
        DWORD readBytes;
        BOOL flag = ReadFile(hFile, buff, size, &readBytes, NULL);
        if (flag == FALSE)
        {
            printf("ReadFile failed/n");
            return "false";
        }
        CloseHandle(hFile);
        return buff;
    
    }
    
    BOOL Write(LPCWSTR file, char *con)
    {
        HANDLE hFile = CreateFile(
            (LPCWSTR)file,
            GENERIC_WRITE | GENERIC_READ,
            0,
            NULL,
            CREATE_ALWAYS,
            FILE_ATTRIBUTE_NORMAL,
            NULL
            );
        if (hFile == INVALID_HANDLE_VALUE)
        {
            return false;
        }
        //TCHAR buff[MAX_PATH];
        DWORD wSize;
        char buff[MAX_PATH];
        sprintf_s(buff, "%s", con);
        BOOL flag = WriteFile(hFile, buff, strlen(buff), &wSize, NULL);
        if (!flag){
            return false;
        }
        //缓冲区内容强制刷新至设备
        if (0 == FlushFileBuffers(hFile))
        {
            printf("Flush failed/n");
        }
        CloseHandle(hFile);
        return true;
    
    }
    void TcharToChar(const TCHAR * tchar, char * _char)
    {
        int iLength;
        //获取字节长度   
        iLength = WideCharToMultiByte(CP_ACP, 0, tchar, -1, NULL, 0, NULL, NULL);
        //将tchar值赋给_char    
        WideCharToMultiByte(CP_ACP, 0, tchar, -1, _char, iLength, NULL, NULL);
    }
    
    void CharToTchar(const char * _char, TCHAR * tchar)
    {
        int iLength;
        iLength = MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, NULL, 0);
        MultiByteToWideChar(CP_ACP, 0, _char, strlen(_char) + 1, tchar, iLength);
    }
    
    int main(int argc, char **argv){
        LPCWSTR filename = TEXT("test.txt");
        char *con = "Hey guys!!";
        if (Write(filename, con))
        {
            MessageBox(NULL, TEXT("Write success!!!"), TEXT("OK"), MB_OK);
        }
    
        char *buff = Read(filename);
        TCHAR str[256];
    
        CharToTchar(buff, str);
    
        if (str)
        {
            TCHAR readBuff[MAX_PATH];
            wsprintf(readBuff, TEXT("%s"), str);
            OutputDebugString(readBuff);
            MessageBox(NULL, readBuff, TEXT("OK"), MB_OK);
        }
        else {
            MessageBox(NULL, TEXT("Oops! There happends something!!"), TEXT("ERROR"), MB_OK);
        }
        return 0;
    }
    View Code

     http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822216.html

    http://baike.so.com/doc/6784090-7000692.html

    lpMapAddress 对地址进行操作,就相当与操作文件了。
    #include "stdafx.h"
    #include <stdlib.h>
    #include <windows.h>
    typedef struct __ListNode
    {
        char data[10];
        struct __ListNode *pNext;
    }ListNode, *pListNode;
    
    int main(int argc, char **argv)
    {
        LPCWSTR file = TEXT("test.txt");
        HANDLE hFile = CreateFile(     //创建或打开文件内核对象
            file,
            GENERIC_WRITE | GENERIC_READ,
            FILE_SHARE_WRITE | FILE_SHARE_READ,
            NULL,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            NULL
            );
    
        if (hFile == INVALID_HANDLE_VALUE)
        {
            return false;
        }
        /*
        DWORD dwWriteSize;
        pListNode curr; //当前节点指针
        pListNode head; //首节点
        head = NULL;
        char temp2[20] = { 0 };
        for (int i = 0; i<10; i++)
        {
            curr = (pListNode)malloc(sizeof(ListNode));
            sprintf(temp2, "%.1d
    ", i);
            strcpy(curr->data, temp2);
            curr->pNext = head;
            head = curr;
        }
        pListNode s;
        s = head;
        wchar_t buff[2] = L"";
        while (s)
        {
            DWORD size = MultiByteToWideChar(CP_ACP, 0, s->data, -1, NULL, 0);
            wchar_t *temp1 = (wchar_t *)malloc(size*sizeof(wchar_t));
            memset(temp1, 0, size*sizeof(wchar_t));
            MultiByteToWideChar(CP_ACP, 0, s->data, -1, temp1, size);
            WriteFile(hFile, temp1, sizeof(temp1), &dwWriteSize, NULL);
            s = s->pNext;
        }
        /**/
        DWORD filesize = GetFileSize(hFile, NULL);
        //创建一个文件映射内核对象
        HANDLE hMap = CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, filesize, NULL);
        if (hMap == INVALID_HANDLE_VALUE)
        {
            return false;
        }
        //将文件数据映射到进程的地址空间
        LPSTR lpMapAddress = (LPSTR)MapViewOfFile(hMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, filesize);
        if (lpMapAddress == NULL)
        {
            printf("MapView error!
    ");
            return -1;
        }
        else
        {
            int m = 0;
            printf("----%d
    ", filesize);
            while (true)
            {
                if (m > filesize)
                {
                    break;
                }
                if (lpMapAddress[m])
                {
                    printf("%c
    ", lpMapAddress[m]);
                    lpMapAddress[m] = 97;//可以更改文件的值
                }
                m++;
    
            }
        }
        
        UnmapViewOfFile(lpMapAddress);
        CloseHandle(hMap);
        CloseHandle(hFile);
        return 0;
    }
    View Code

    下面是linux的版本

    #include<stdio.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <sys/mman.h>
    #include <fcntl.h>
    int main(){
            int  File;
            struct stat sb;
            unsigned char *startAddr;
    
            File = open("./OPWIN.bin",O_RDONLY);
            //File = open("./test.txt",O_RDONLY);
            fstat(File,&sb);
    
            printf("--------%d
    ",sb.st_size);
            startAddr=(unsigned char *)mmap(NULL,sb.st_size,
                PROT_READ,MAP_PRIVATE,File,0);
    
            //printf("%s",startAddr);
            munmap(startAddr,sb.st_size);
            close(File);
    
    
    }
    View Code
  • 相关阅读:
    动态规划>0/1背包问题 小强斋
    【C/C++和指针】auto_ptr智能指针
    WEBSHELL
    sql反模式分析1
    SQLServer之Compute/ComputeBy实现数据汇总
    链表算法大全
    【C++ Primer】自己动手编写函数 atoi(char *str)
    MySQL 5.5 的COMPRESSED INNODB 表
    【设计模式】加薪非要老总批 职责链模式
    【C和指针】const指针
  • 原文地址:https://www.cnblogs.com/yuguangyuan/p/5955980.html
Copyright © 2020-2023  润新知