2016-08-03 37 views
-1

bitte helfen Sie mir beim Lesen von Memory-Mapped-Datei. Ich öffne Datei im Code unten. Und dann möchte ich Bytes von 8 bis 16 lesen. Wie kann ich das tun?Memory-Mapped-Datei 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

Ist ein dublicate von dieser: [link] (http://stackoverflow.com/questions/9889557/mapping-large-files-using-mapviewoffile). Sie haben den Zeiger m_lpMapAddress, der hoffentlich ein Bytezeiger ist. Fügen Sie dem Zeiger 8 Bytes hinzu und lesen Sie den Speicher. Das ist alles – mrAtari

+0

@mrAtari Wie kann ich 8 Bytes hinzufügen? – ExiD

+0

m_lpMapAddress + = 8 – mrAtari

Antwort

4

Sie können darauf wie jeder andere Speicherblock zugreifen. Hier ist ein Beispiel, das dieses Bytes interpretiert als unsigned char s druckt:

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

gibt es schöneres soulution? Was ist, wenn ich Bytes in der Struktur lesen möchte? – ExiD

+0

@ExiD: A * "Schöner" * Zugriff auf Speicher? Keine, von denen ich weiß. Mehr verschachtelt? Wahrscheinlich. Was genau magst du an der kanonischen Methode nicht? – IInspectable

+0

@ExiD Sie können einfach tun, MyStruct * mappedDataAsMyStruct = (MyStruct *) m_lpMapAddress; 'oder ähnlich. Achte auf eine Ausrichtung, die deine Struktur nicht so auslegen lässt, wie du es möchtest. – immibis