c/c++內存映射大文件讀取

來源:本網整理

內存映射,也是需要分配內存的.比如我將一個文件映射到內存,在內存中操作時,是改寫的內存中的文件,最后需要回寫才能保存更改.所謂映射就是一個簡單的備份,或者叫重定向.至于內存的釋放,一般在程序中,棧區的內存會被系統自動回收,系統的內存管理機制請參考其他資料.現在由于語言的不同,對堆區的內存管理方式也不同,不過一般需要手動釋放,也就是把內存歸還系統并且在程序中忘記此地址以防止重用.不明白請追問www.13333515.buzz防采集請勿采集本網。

在下用qt做一個代碼編輯區之類的東東,有的文件比較大所有映射到內存里,然后分塊顯示到界面上,但是問題來了,每塊最后結束時都有亂碼,有沒有大神給指導下或有更好的方法可以借鑒的?不明白?是文本還是二進制?如果是文本 的話后面記得加'\0'

=======================其他用戶的看法====================

/給出一個思路,僅供參考 1.依次遍歷找到文件中的指定關鍵字的位置 可用用memcmp 進行比較 2.根據協議(寫數據時的格式)將指定長度的數據讀取來(還有行的概念嗎?3.輸出數據到屏幕上

bug。有兩個特點。

誰跟你說txt是這樣讀取的啦(錘錘錘 最開始學c語言文件操作的時候老師有說過“文本文件”和“二進制文件”的區別吧?啥?當時沒學好?回去補

1、bug出現的地方,永遠是不可預知的。

我記得我5年前碰到過這個問題,想以文件的操作過程和語句生成一個內存中的文件并將文件傳遞給另外一個函數,因為在內存中,所以速度快,但當時查了很多資料,無解,最后迫不得已用的臨時文件。

2、bug總有它驚人的邏輯嚴謹性。大多數情況下,bug的總是正確,一致的反應bug。哈。

功能:在一個大文件(文件名BigFile.txt)中,查找一字符串”End”。實現根據字符串\"End\"將文件截斷的功能。代碼工程名IOTest.sln: 詳細代碼見BigFileFun.h、BigFileFun.cpp 調用代碼見IOTest.cpp中_tmain

你的“都有亂碼”的“都”字說明代碼有bug。

你可以在CreateFile后,SetFilePointer,再SetEndOfFile(如果需要擴大文件大小的話) 然后再CreateFileMapping,MapViewOfFile 這時通過MapViewOfFile 得到的一塊內存,就對應文件的一塊區域 直接

===========================================

字節對齊,memset(addr,0,sizeof(addr))

===========================================

自己對齊問題導致的?

===========================================

如樓上,目測是內存對齊。

嘗試分配內存的時候初始化內存塊。

===========================================

#includeincludeincludeint main(){HANDLE hFile=CreateFile(_T("1.txt"),GENERIC_READ|GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0);if(hFile=INVALID_HANDLE_VALUE){puts("fail to create file");goto fail_open;}SetFileValidData(hFile,1024);HANDLE hMap=CreateFileMapping(hFile,0,PAGE_READWRITE,0,1024,0);if(hMap=NULL){puts("fail to create mapping");goto fail_map;}LPVOID pContent=MapViewOfFile(hMap,FILE_MAP_WRITE,0,0,1024);if(pContent=0){puts("fail to open mapping");goto fail_view;}好了,此時這個文件就相當于你用malloc申請的一個1024字節的內存空間。char*pStr=(char*)pContent;strcpy(pStr,"hahaha");UnmapViewOfFile(pContent);fail_view:CloseHandle(hMap);fail_map:CloseHandle(hFile);fail_open:return 0;}內容來自www.13333515.buzz請勿采集。

免責聲明 - 關于我們 - 聯系我們 - 廣告聯系 - 友情鏈接 - 幫助中心 - 頻道導航
Copyright © 2017 www.13333515.buzz All Rights Reserved
3排列五开奖结果