已經創建了映射視圖,如下:
//創建檔案物件
HANDLE hFile = CreateFile(
sFileName,
GENERIC_READ,
FILE_SHARE_READ ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return ;
}
//創建檔案映射物件
HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
if (hFileMap == NULL)
{
return;
}
// 得到系統分配粒度
SYSTEM_INFO SysInfo;
GetSystemInfo(&SysInfo);
DWORD dwGran = SysInfo.dwAllocationGranularity;
// 得到檔案尺寸
DWORD dwFileSizeHigh;
__int64 qwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
qwFileSize |= (((__int64)dwFileSizeHigh) << 32);
// 偏移地址
__int64 qwFileOffset = 0;
// 塊大小
DWORD dwBlockBytes = 0;
for (int i = 1; ; ++i)
{
if (qwFileSize <= i * dwGran)
{
dwBlockBytes = i * dwGran;
break;
}
}
if (qwFileOffset >= 0)
{
// 映射視圖
//如果在呼叫MapViewOfFile()的時候,dwNumberOfBytesToMap如果大于檔案的size,那么該call就會失敗,
//并且error code是access denied。所以MapViewOfFile的最后一個引數不能用dwBlockSize而只能用qwFileSize。
//MapViewOfFile的回傳值不能是TCHAR*,因為UNICODE時解釋成寬字符,會出錯,只能用char*
char *lpbMapAddress = (char *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, qwFileSize);
if (lpbMapAddress == NULL)
{
CloseHandle(hFileMap);
CloseHandle(hFile);
return;
}
///讀檔案內容
}
向求問大家,怎么具體去讀檔案的內容,二進制檔案,內容包含有double、int等型別資料???
uj5u.com熱心網友回復:
lpbMapAddress 即是檔案內容, 類似于一段記憶體資料但是二進制檔案 你的了解檔案結構才行(比如結構體), 否則只是一段資料而已
uj5u.com熱心網友回復:
直接二進制讀取到陣列 然后需要自己決議對應欄位轉換回其他資料uj5u.com熱心網友回復:
你不有一個char *lpbMapAddress嗎?這不就是檔案內容嗎?
uj5u.com熱心網友回復:
我對這個不是很了解。假設我的二進制檔案的實際內容是 hello! 3.14 2.45 這樣的,前面是字符型別,后面兩個是float型,應該怎么讀呢???
下面是我之前寫的一段讀取代碼,麻煩幫忙看看!!謝謝
char header;
do
{
header = (char)lpbMapAddress;
lpbMapAddress++;
} while (header != ‘!’);
float*ax = (float*)lpbMapAddress;
float*ay = (double*)lpbMapAddress+4;
uj5u.com熱心網友回復:
僅供參考:void HexDump(char *buf,int len,int addr) {
int i,j,k;
char binstr[80];
for (i=0;i<len;i++) {
if (0==(i%16)) {
sprintf(binstr,"%08x -",i+addr);
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
} else if (15==(i%16)) {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
sprintf(binstr,"%s ",binstr);
for (j=i-15;j<=i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
} else {
sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
}
}
if (0!=(i%16)) {
k=16-(i%16);
for (j=0;j<k;j++) {
sprintf(binstr,"%s ",binstr);
}
sprintf(binstr,"%s ",binstr);
k=16-k;
for (j=i-k;j<i;j++) {
sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
}
printf("%s\n",binstr);
}
}
uj5u.com熱心網友回復:
實際上你這里的問題已經變為二進制記憶體的決議問題,與記憶體映射無關。你根據你構造資料的規則決議即可。
后面兩個是float型,
float*ay = (double*)lpbMapAddress+4;
這句改成
float*ay = (float*)(lpbMapAddress+4);
先不考慮unicode,決議成功再說。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/120631.html
標籤:基礎類
