2016-08-03 4 views
-1

메모리 매핑 된 파일을 읽는 것을 도와주세요. 아래 코드에서 파일을 엽니 다. 그리고 나서 8에서 16으로 바이트를 읽고 싶습니다. 어떻게 할 수 있습니까?메모리 매핑 된 파일 C++

// 0. Handle or create and handle file 
m_hFile = CreateFile(file_path.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
if (m_hFile == INVALID_HANDLE_VALUE) 
{ 
    if (GetLastError() == ERROR_FILE_NOT_FOUND) 
    { 
     m_hFile = createNewFile(file_path.c_str()); 
    } 
    else throw GetLastError(); 
} 

// 1. Create a file mapping object for the file 
m_hMapFile = CreateFileMapping(m_hFile, NULL, PAGE_READWRITE, 0, 0, NULL); 
if (m_hMapFile == NULL) throw GetLastError(); 

// 2. Map the view. 
m_lpMapAddress = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0); 
// to map 
if (m_lpMapAddress == NULL) throw GetLastError(); 
+0

이 하나에서 dublicate인가 : 여기 unsigned char의 해석 그 바이트를 인쇄하는 예이다 [링크] (http://stackoverflow.com/questions/9889557/mapping-large-files-using-mapviewoffile). 당신은 m_lpMapAddress 포인터를 가지고있다. 이것은 아마도 포인터 일 것이다. 포인터에 8 바이트를 더하고 메모리를 읽습니다. 그게 전부 야 – mrAtari

+0

@mrAtari 어떻게 8 바이트를 추가 할 수 있습니까? – ExiD

+0

m_lpMapAddress + = 8 – mrAtari

답변

4

다른 메모리 블록과 마찬가지로 액세스 할 수 있습니다.

unsigned char *mappedDataAsUChars = (unsigned char*)m_lpMapAddress; 

for(int k = 8; k < 16; k++) 
    std::cout << "Byte at " << k << " is " << mappedDataAsUChars[k] << std::endl; 
+0

더 아름다운 soulution이 있습니까? 구조체에서 바이트를 읽으려면 어떻게해야합니까? – ExiD

+0

@ExiD : A * "더 아름답다"* 메모리에 액세스하는 방법? 내가 아는 누구도. 더 복잡한 아마. 그러나 그것을하기위한 표준 방법에 대해 당신은 정확히 무엇을 싫어합니까? – IInspectable

+0

@ExiD MyStruct * mappedDataAsMyStruct = (MyStruct *) m_lpMapAddress; 또는 이와 유사한 것을 쉽게 할 수 있습니다. 구조가 원하는대로 배치되지 않도록 조심하십시오. – immibis