• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            力為的技術(shù)博客

            聯(lián)系 聚合 管理
              154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

            ???????????????????????????????????? 如何通過(guò)FILE*操作內(nèi)存文件

            /*
            問(wèn)題概述:
            ? 有這樣一個(gè)第三方的庫(kù)函數(shù)void WriteDataToFile(FILE* pFile),它是向一個(gè)文件寫(xiě)入數(shù)據(jù)。
            ? 現(xiàn)在需要通過(guò)函數(shù)WriteDataToFile生成臨時(shí)數(shù)據(jù),但不能生成磁盤(pán)文件(需要在內(nèi)存中操作)。
            ? 然后通過(guò)某種方式讀取內(nèi)存中的數(shù)據(jù)。

            流程設(shè)想:
            1、
            創(chuàng)建一個(gè)內(nèi)存文件
            獲取該內(nèi)存文件的FILE*
            寫(xiě)入數(shù)據(jù)
            2、
            打開(kāi)該內(nèi)存文件
            獲取內(nèi)存文件的FILE*
            讀取內(nèi)存文件的內(nèi)容
            關(guān)閉
            3、
            關(guān)閉
            *********************************************************************************
            需要解決的問(wèn)題:
            1. 內(nèi)存文件的HANDLE是否可以轉(zhuǎn)換為FILE* (_open_osfhandle不可以)
            2. 內(nèi)存文件的操作需要調(diào)用PVOID pView = MapViewOfFile(...); 通過(guò)pView才能更改內(nèi)存文件之內(nèi)容。
            ?? 通過(guò)FILE* 能否通過(guò)某種方式操作pView的內(nèi)容
            3. 需要實(shí)現(xiàn)的函數(shù)(見(jiàn)下面的測(cè)試代碼)
            ?? FILE* GetFilePtrByMemFileHandle(HANDLE hMemFile)
            ?? void UpdateMemFile(HANDLE hMemFile)
            4. 如果該方案有問(wèn)題,可以更改

            **********************************************************************************
            實(shí)現(xiàn):
            ? 1.為了方便測(cè)試使用全局的文件HANDLE
            ? 2.模擬實(shí)現(xiàn)了WriteDataToFile函數(shù)
            ? 3.已有資料http://community.csdn.net/Expert/TopicView.asp?id=4317083

            ?1*/
            ?2#define?MF_NAME?TEXT("MF_FILE_NAME")
            ?3#define?MF_SIZE?4*1024
            ?4HANDLE?g_hMemFile?=?NULL;
            ?5//?模擬庫(kù)函數(shù)WriteDataToFile
            ?6void?WriteDataToFile(FILE*?pFile)
            ?7{
            ?8???ASSERT(pFile);
            ?9???fputs("Write?by?Lib?Function!\n",?pFile);
            10}

            11
            12BOOL?CreateMemFile()
            13{
            14g_hMemFile?=?CreateFileMapping(INVALID_HANDLE_VALUE,?
            15NULL,?PAGE_READWRITE,?0,?
            16MF_SIZE,?MF_NAME);
            17if(g_hMemFile?!=?NULL)
            18{
            19if(GetLastError()?==?ERROR_ALREADY_EXISTS)
            20{
            21TRACE("STL?MapFile?already?exists.");
            22CloseHandle(g_hMemFile);
            23return?FALSE;
            24}

            25return?TRUE;
            26}

            27return?FALSE;
            28}

            29
            30FILE*?GetFilePtrByMemFileHandle(HANDLE?hMemFile)
            31{
            32//.
            33//具體的實(shí)現(xiàn)
            34
            35//.
            36return?NULL;
            37}

            38void?UpdateMemFile(HANDLE?hMemFile)
            39{
            40//..
            41//需要實(shí)現(xiàn)
            42}

            43
            44void?Test()
            45{
            46//?1?寫(xiě)內(nèi)存文件
            47if(CreateMemFile()?==?FALSE)
            48return;
            49
            50?????FILE*?pFile?=?GetFilePtrByMemFileHandle(g_hMemFile);
            51?if(NULL?==?pFile)
            52?{
            53?CloseHandle(g_hMemFile);
            54?return;
            55?}

            56
            57?WriteDataToFile(pFile);
            58?//更新內(nèi)存文件
            59?UpdateMemFile(g_hMemFile);
            60
            61//?2?讀內(nèi)存文件
            62?HANDLE?hFile?=?OpenFileMapping(FILE_MAP_READ?|?FILE_MAP_WRITE,?FALSE,?MF_NAME);
            63?if(hFile?!=?NULL)
            64?{
            65?FILE*?pReadFile?=?GetFilePtrByMemFileHandle(hFile);
            66?if(pReadFile)
            67?{
            68?char?strBuffer[BUFSIZ];
            69????????????int?nPtCount?=?0;
            70????????????while(fgets(strBuffer,?BUFSIZ,?pReadFile)?!=?NULL)
            71{
            72TRACE(strBuffer);
            73}

            74?}

            75?CloseHandle(hFile);
            76?}

            77//?3?關(guān)閉?
            78?CloseHandle(g_hMemFile);
            79}

            80
            81
            posted on 2005-10-14 17:30 力為 閱讀(7695) 評(píng)論(11)  編輯 收藏 引用 所屬分類(lèi): 4. C++ FAQ

            評(píng)論

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-10-15 14:01 任我行
            關(guān)注,等你寫(xiě)全了,我就來(lái)用,哈哈。
              回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-10-15 21:11 力為
            這個(gè)在CSDN上放了幾天也沒(méi)有人回答
            是不是太難了呢?  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-10-17 15:50 moonriver
            不理解為什么要這樣干? 能否把BACKGROUND將清楚些!  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-10-19 15:02 力為
            background:
            1. 使用第三方的接口生成某種格式的文件
            2. 自己從該文件中分析需要的數(shù)據(jù)
            3. 該文件為中間文件并不需要放在磁盤(pán)之上


            故用內(nèi)存文件保存臨時(shí)數(shù)據(jù)
              回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-12-04 14:43 hehehe
            不理解啊!把文件讀入緩沖區(qū),再處理緩沖區(qū)中的文件,是這個(gè)意思嗎?  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-12-05 09:14 力為
            也可以這樣認(rèn)為。
            只不過(guò)通過(guò)FILE如何把內(nèi)容寫(xiě)入緩沖區(qū)?  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-12-05 13:37 hehehe
            一般來(lái)說(shuō),我比較喜歡這個(gè)函數(shù)。。。
            BOOL ReadFile(
            HANDLE hFile, // handle of file to read
            LPVOID lpBuffer, // pointer to buffer that receives data
            DWORD nNumberOfBytesToRead, // number of bytes to read
            LPDWORD lpNumberOfBytesRead, // pointer to number of bytes read
            LPOVERLAPPED lpOverlapped // pointer to structure for data
            );
            那個(gè)lpBuffer就是指向緩沖區(qū)的指針,要在內(nèi)存中操作文件,我就用這個(gè)。。。  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2005-12-05 13:50 力為
            但C語(yǔ)言的FILE*如何往緩沖區(qū)寫(xiě)內(nèi)容呢?  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2006-01-07 10:27 力為
            在懸掛了N月之后,我為此題下了結(jié)論:此題無(wú)解!:(  回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2006-01-22 15:20 stronger
            https://sourceforge.net/project/shownotes.php?release_id=340318

              回復(fù)  更多評(píng)論
              

            # re: 如何通過(guò)FILE*操作內(nèi)存文件? 2010-10-08 01:44 macostar_wzy
            內(nèi)存映射API函數(shù)CreateFileMapping創(chuàng)建一個(gè)有名的共享內(nèi)存:
            HANDLE CreateFileMapping(
            HANDLE hFile, // 映射文件的句柄,
            //設(shè)為0xFFFFFFFF以創(chuàng)建一個(gè)進(jìn)程間共享的對(duì)象
            LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // 安全屬性
            DWORD flProtect, // 保護(hù)方式
            DWORD dwMaximumSizeHigh, //對(duì)象的大小
            DWORD dwMaximumSizeLow,
            LPCTSTR lpName // 必須為映射文件命名
            );
            要把文件映像到內(nèi)存,首先必須調(diào)用CreateFileMapping()函數(shù),它需要用一個(gè)由CreateFile()函數(shù)打開(kāi)并返回的文件句柄,對(duì)大多數(shù)共享內(nèi)存的應(yīng)用程序,必須把此句柄設(shè)置為0xFFFFFFFF,用來(lái)指定系統(tǒng)頁(yè)面文件。通過(guò)使用上面的特殊句柄,0XFFFFFFFF是INVALID_HANDLE_VALUE,表示不指定文件,在系統(tǒng)分頁(yè)文件(pagefile.sys)中分配映射的磁盤(pán)空間,可以不調(diào)用CreateFile函數(shù),當(dāng)然在完成時(shí),也不必有一個(gè)內(nèi)存的磁盤(pán)文件拷貝。
              回復(fù)  更多評(píng)論
              

            九九久久精品无码专区| 日本久久久久久中文字幕| 国产精品久久久久蜜芽| 久久久久av无码免费网| 国产综合成人久久大片91| 四虎国产精品成人免费久久| 久久精品亚洲一区二区三区浴池| Xx性欧美肥妇精品久久久久久| 好久久免费视频高清| 77777亚洲午夜久久多喷| 久久亚洲私人国产精品| 久久国产AVJUST麻豆| 99久久久精品免费观看国产| 久久久久99精品成人片直播| 精品水蜜桃久久久久久久| 日日躁夜夜躁狠狠久久AV| 久久中文精品无码中文字幕| 欧美色综合久久久久久| 国产精品久久久久天天影视| 一级A毛片免费观看久久精品| 久久久久国产精品人妻| 成人国内精品久久久久影院VR | 品成人欧美大片久久国产欧美| 久久久久久综合网天天| 久久久久亚洲精品无码网址| 精品无码久久久久久尤物| 久久人人青草97香蕉| 色欲久久久天天天综合网| 伊人久久大香线蕉av一区| 国产亚洲美女精品久久久2020| 久久香蕉国产线看观看猫咪?v| 久久精品成人免费网站| 99久久精品午夜一区二区| 久久久老熟女一区二区三区| 97精品依人久久久大香线蕉97| 久久久久香蕉视频| 无码人妻久久一区二区三区免费| 波多野结衣久久精品| 久久综合视频网| 久久毛片一区二区| 精品伊人久久大线蕉色首页|