つーことは別の説が有力ってことになってきます。
夢の世界はパラレルワールド説。
並行世界なんて無数にあるんだから。
パラレルワールドなんて言ったもん勝ちですよ。
つまり並行世界では本田 望結と俺は
血を分けた家族って事か。
いいじゃないか。
はい、前口上が徐々に長くなっていますが、
前回の続きをしましょう。
何故、
初期のファイルサイズ分しか、データを取り扱えないのか、
これは、前回僕がアップしたソースに問題があります。
関数の設定の都合上、
読み込んだ
ファイルサイズちょうどだけデータをマッピングするようになっています。
メモリ上にそのサイズ分がマッピングされるため、
初期に設定したサイズ(この場合ファイルサイズ)を超えると
オーバーフローしてしまうわけです。
こういう場合にどうすればいいか、
マッピングする前に、
ファイルサイズを増長してやることで、ひとまず解決できます。
ファイルサイズを増長した状態で、マッピングしてやることで、大目にデータを保持できます。
で、ソース的にはどうすんのよ?
これは、既存の設定を変えるだけでできます。
CreateFileMapping関数を見てください。
2,ファイルをメモリにマッッピングする関数。
HANDLE CreateFileMapping(
HANDLE hFile, // ファイルのハンドル
LPSECURITY_ATTRIBUTES lpAttributes, // セキュリティ
DWORD flProtect, // 保護
DWORD dwMaximumSizeHigh, // サイズを表す上位 DWORD
DWORD dwMaximumSizeLow, // サイズを表す下位 DWORD
LPCTSTR lpName // オブジェクト名
);
第4引数、
dwMaximumSizeHighは4GBを超えるデータを扱う場合でない限り0で結構です。
が、第5引数
dwMaximumSizeLowは若干動きが変わります。
最低でもこれだけはマッピングするぞっていう値
を設定する個所です。
つまり、ここに適当な値を入れれば、その分だけマッピングされるわけです。
マッピングされた時点で、足りないサイズ分は、
自動増長されるので、
上記方法には打って付けなわけです。
前回のソースを見てみます。
main.cpp
//Section2:メモリ空間上にマッピング
hMap = CreateFileMapping( hFile , 0 , PAGE_READWRITE , 0 , 0 , "FileMapping_katuusagi" );
if( hMap <= 0 )
{
printf( "ファイルをマッピングできねーしー." ); //エラー
CloseHandle( hFile ); //せっかく開いたけどクローズせざるを得ない(´;ω;`)
return 1;
}
|
第5引数には0が設定されていますよね、
これは、
ファイルサイズぴったりを確保するという意味です。
main.cpp
//Section2:メモリ空間上にマッピング
hMap = CreateFileMapping( hFile , 0 , PAGE_READWRITE , 0 , 256 , "FileMapping_katuusagi" );
if( hMap <= 0 )
{
printf( "ファイルをマッピングできねーしー." ); //エラー
CloseHandle( hFile ); //せっかく開いたけどクローズせざるを得ない(´;ω;`)
return 1;
}
|
こうしてやれば、256バイト確保されるということになります。
ただし、
察しの良い方は気付かれてると思いますが、
この方法には欠点があります。
最初に確保する値を設定しなければならないため、
最終的に入力されるサイズがわかっていないといけない。
ということです。
そうです、これまで
”メモリマップドファイルは文字列操作的に、データを操作する”
っぽくやってきましたが、
実は、
可変長な文字列だと、期待した実行結果が得られにくい!
(読み込みのみなら、かなり役に立ちますが、)
ならば、メモリマップドファイルで、扱うのに向いているのは
どういったデータなのでしょうか?
むしろここからがメモリマップドファイルの
真価と言えますが、
それはまた次回、
そ~れ~で~は~(*´∀`)ノ
PR
COMMENT