2016-08-03 6 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あり:[リンク](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 Sとして解釈これらのバイトを印刷する例は次のとおり

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

もっと美しい魂がありますか?私は構造体でバイトを読み込みたいのですが? – ExiD

+0

@ExiD:A *「もっと美しい」*メモリにアクセスする方法?私が知っていることは何もありません。もっと畳み込まれた?多分。しかし、それを行う標準的な方法について、あなたは正確に何を嫌っていますか? – IInspectable

+0

@ExiDあなたは 'MyStruct * mappedDataAsMyStruct =(MyStruct *)m_lpMapAddress; 'などと同じことを簡単に行うことができます。あなたの構造があなたの望む通りにレイアウトされないようにするための調整を見てください。 – immibis

関連する問題