Как создать FileMapping в C++?

Я пишу предварительный загрузчик игры (простая программа, которая загружает определенные файлы [карты] в кеш перед запуском программы. Мне сказали использовать CreateFileMapping, который я до сих пор не уверен, загружает ли он его в физическую или виртуальную память...

В любом случае, куда бы я поместил файлы, которые мне нужно загрузить?

Вот мой код (на самом деле закодированный кем-то другим при переполнении стека, который сказал мне его использовать)

#include <windows.h>
#include <cstdio>

void pf(const char* name) {

HANDLE file = CreateFile(name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(file == INVALID_HANDLE_VALUE) { printf("couldn't open %s\n", name); return; };

unsigned int len  = GetFileSize(file, 0);

HANDLE mapping  = CreateFileMapping(file, 0, PAGE_READONLY, 0, 0, 0);
if(mapping == 0) { printf("couldn't map %s\n", name); return; }

const char* data = (const char*) MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);

if(data)
{
    printf("prefetching %s... ", name);

    // need volatile or need to use result - compiler will otherwise optimize out whole loop
    volatile unsigned int touch = 0;

    for(unsigned int i = 0; i < len; i += 4096)
        touch += data[i];
}
else
    printf("couldn't create view of %s\n", name);

UnmapViewOfFile(data);
CloseHandle(mapping);
CloseHandle(file);
}

int main(int argc, const char** argv)
{
if(argc >= 2) for(int i = 1; argv[i]; ++i) pf(argv[i]);
return 0;
}

person user1808010    schedule 08.11.2013    source источник
comment
Ни один из показанных вами кодов не является C++, поэтому его следует пометить как C.   -  person Remy Lebeau    schedule 08.11.2013
comment
@Remy - он может использовать компилятор C ++ через переключатель /Tp или имя исходного файла *.cpp.   -  person jww    schedule 30.06.2017
comment
Содержимое файла загружается в оперативную память, адрес памяти которой data соответствует строке const char* data. Если вы поставите точку останова и воспользуетесь memory viewer Visual Studio и введете адрес памяти, обозначенный data, вы увидите шестнадцатеричное представление содержимого файла. Если у вас есть (cygwin) оболочка bash, вы можете увидеть тот же шестнадцатеричный вид: od -w32 --endian=big -t x1z /path/to/file.txt   -  person eigenfield    schedule 17.10.2018


Ответы (1)


Функция pf принимает в качестве параметра путь к файлу. Сенсорный цикл вызывает загрузку файла (или его частей размером не менее 4 КБ) в физическую память.

person ScottMcP-MVP    schedule 08.11.2013
comment
Привет, не могли бы вы сказать мне, как добавить параметр в void pf? Я новичок в С++ - person user1808010; 08.11.2013
comment
У вас уже есть параметр для pf(), что именно вы пытаетесь добавить? - person Remy Lebeau; 08.11.2013
comment
Я добавлю новый целочисленный параметр с именем index по: void pf(const char* name,int index) - person eigenfield; 18.10.2018