У меня есть очень большой файл, который я бы хотел использовать CreateFileMapping и MapViewOfFile для извлечения из него 10 байтов текста на основе заданного номера идентификатора. Так вот что я тщетно,случайным образом читает файл с mapviewoffile
char* Read(char*pFilename, int id)
{
HANDLE hFile = ::CreateFile(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetSystemInfo(&sysInfo);
DWORD dwSysGran = sysInfo.dwAllocationGranularity;
DWORD dwFileMapStart = ((id*10/ dwSysGran)*dwSysGran);
DWORD dwMapViewSize = (id*10 % dwSysGran) + 10;
DWORD dwFileMapSize = id*10 + 10;
char data[10];
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, dwFileMapSize, NULL);
if (hMap != NULL)
{
char *rawBuffer = (char*)MapViewOfFile(hMap, FILE_MAP_READ, 0, dwFileMapStart, dwMapViewSize);
memcpy(&data[0], rawBuffer, 10);
UnmapViewOfFile(rawBuffer);
}
//...
return data;
}
Например, если пользователь вводит файл с именем «characterWeaponData.ucc» и an identifier = 122
тогда моя программа должна прочитать 10 байтов текста, начиная с 1220-го байта в файл и вернуть их для дальнейшей обработки.
Я написал этот код исключительно на основе нескольких ресурсов, которые я нашел на SO и до сих пор у меня не было ни одного тщательного идею о том, что на земле
_In_ DWORD dwFileOffsetHigh,
_In_ DWORD dwFileOffsetLow,
в этих двух функций на самом деле означает сделать. И я думаю, что мои параметры передавались в них, как в приведенных выше программах, неверны.
Зачем использовать сопоставление памяти для этого, когда вы можете открыть файл и искать нужный вам счет? – molbdnilo
64-разрядное число разделено на два 32-битных значения, ** высокий ** est 32 бит и ** низкий ** est 32 бит. –
Но зачем они и как их использовать в этом случае? –