Как распарсить файл через <windows.h> MapViewOfFile?

116
15 января 2020, 10:40

MapViewOfFile возвращает указатель на начало проекции куска большого текстового файла. А какие должны быть дальнейшие манипуляции, чтобы разобрать этот кусок по строкам? Как, например, представить его потоком и использовать while(std::getline(...))?

#include <windows.h>
#include <string>
#include <iostream>
#include <fstream>
#include <istream>

void ProcessChunk(LPVOID lpMapAddress, DWORD dwMapViewSize)
{
     // застрял тут.
}

bool ReadInChunks(const WCHAR *lpcTheFile)
{
    HANDLE hFile = CreateFile(
        lpcTheFile,                     //LPCSTR lpFileName,
        GENERIC_READ | GENERIC_WRITE,   //DWORD dwDesiredAccess,
        FILE_SHARE_READ,                //DWORD dwShareMode,
        NULL,                           //LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        OPEN_EXISTING,                  //DWORD dwCreationDisposition,
        FILE_ATTRIBUTE_NORMAL,          //DWORD dwFlagsAndAttributes,
        NULL                            //HANDLE hTemplateFile
    );
    if (hFile == INVALID_HANDLE_VALUE){
        _tprintf(
            TEXT("hFile is NULL\n")
        );
        _tprintf(
            TEXT("Target file is %s\n"),
            lpcTheFile
        );
        system("pause");
        return false;
    }


    HANDLE hMapFile = CreateFileMapping(
        hFile,                          //HANDLE hFile,
        NULL,                           //LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
        PAGE_READWRITE,                 //DWORD flProtect,
        0,                              //DWORD dwMaximumSizeHigh,
        0,                              //DWORD dwMaximumSizeLow,
        NULL                            //LPCSTR lpName
    );
    if (hMapFile == NULL) {
        _tprintf(TEXT("hMapFile is NULL: last error: %d\n"), GetLastError());
        system("pause");
        return false;
    }


    SYSTEM_INFO sysinfo = { 0 };
    ::GetNativeSystemInfo(&sysinfo);
    DWORD dwSysGran = sysinfo.dwAllocationGranularity;

    LARGE_INTEGER file_size = { 0 };
    ::GetFileSizeEx(hFile, &file_size);
    const uint64_t dwFileSize = static_cast<uint64_t>(file_size.QuadPart);
    if (dwFileSize == NULL) {
        _tprintf(TEXT("dwFileSize is NULL: last error: %d\n"), GetLastError());
        system("pause");
        return false;
    }

    //Size of the file mapping view.
    DWORD dwMapViewSize = dwSysGran * 2;

    for (uint64_t offset = 0; offset < dwFileSize; offset += dwMapViewSize) {
        DWORD high = static_cast<DWORD>((offset >> 32) & 0xFFFFFFFFul);
        DWORD low = static_cast<DWORD>(offset & 0xFFFFFFFFul);
        // The last view may be shorter.
        if (offset + dwMapViewSize > dwFileSize) {
            dwMapViewSize = dwFileSize - offset;
        }

        LPVOID lpMapAddress = MapViewOfFile(
            hMapFile,                       //HANDLE hFileMappingObject,
            FILE_MAP_ALL_ACCESS,            //DWORD  dwDesiredAccess,
            high,                           //DWORD  dwFileOffsetHigh,
            low,                            //DWORD  dwFileOffsetLow,
            dwMapViewSize                   //SIZE_T dwNumberOfBytesToMap
        );
        if (lpMapAddress == NULL)
        {
            _tprintf(TEXT("lpMapAddress is NULL: last error: %d\n"), GetLastError());
            system("pause");
            return false;
        }

        ProcessChunk(lpMapAddress, dwMapViewSize);
    }
}



int wmain(int argc, wchar_t** argv)
{
    ReadInChunks(argv[1]);
    system("pause");
    return 0;
}
READ ALSO
Получить ID потока в переменную

Получить ID потока в переменную

Как извлечь ID потока из pthread_self() в целочисленную переменную? То есть что-то типа такого:

134
Как изменить тему в других activity?

Как изменить тему в других activity?

Я новичок и прошу помощиЕсть ThemesActivity в котором прописано динамическое изменение темы при выборе одного из radiobutton

178
(Java) Значение, проверяемое if, истинно, но срабатывает else

(Java) Значение, проверяемое if, истинно, но срабатывает else

Недавно начал учить Java, изучал if, решил вот такое написатьПри вводе правильного username и password, которые соответствуют adminUsername и adminPassword, всё-равно...

148
Не знаю, какие классы использовать для создания анимации на SurfaceView в потоке Surface Holder

Не знаю, какие классы использовать для создания анимации на SurfaceView в потоке Surface Holder

Есть массив элементов: у каждого есть координаты, bitmap и список анимаций (поворот, перемещение), который элемент должен выполнитьВсе в потоке...

146