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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Как извлечь ID потока из pthread_self() в целочисленную переменную? То есть что-то типа такого:
Я новичок и прошу помощиЕсть ThemesActivity в котором прописано динамическое изменение темы при выборе одного из radiobutton
Недавно начал учить Java, изучал if, решил вот такое написатьПри вводе правильного username и password, которые соответствуют adminUsername и adminPassword, всё-равно...
Есть массив элементов: у каждого есть координаты, bitmap и список анимаций (поворот, перемещение), который элемент должен выполнитьВсе в потоке...