4GBを超えるファイルの読込 – 固定ページ 2 – プログラミング – Home

4GBを超えるファイルの読込
 
通知
すべてクリア

[解決済] 4GBを超えるファイルの読込

固定ページ 2 / 2

ももたろう
 ももたろう
(@ももたろう)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

NowNowさん、各無しさん

おはようございます。
お返事が遅くなりすいません。データを入れているサーバーのHDDが調子が悪く
壊れかかっているとかで...。

li.LowPart = (6442450943)&0x00000000FFFFFFFF;
li.HighPart = ((6442450943)&0xFFFFFFFF00000000) >> 32;

でliにきちんと6442450943入ることをデバックモードで確認できました。
ありがとうございます。

データの読込は、freadのままだったので、ReadFileにして読み込みファイルエンド
まで行くか、現在、約5GBのファイルを使って確認しています(昨日間違って、freadの
ままで実行させてしまい、2GB計算するのに6時間半かかっていました)。

int i, HEADER_SIZE, HEADER_SIZE_1;
li.LowPart = (HEADER_SIZE+HEADER_SIZE_1*i)&0x00000000FFFFFFFF;
li.HighPart = ((HEADER_SIZE+HEADER_SIZE_1*i)&0xFFFFFFFF00000000) >> 32;
SetFilePointerEx(hFile, li, NULL, FILE_BEGIN);

//RAW_Data_infoは構造体の構造体
RAW_Data_info *data;
n = ReadFile(hFile, data, sizeof(RAW_Data_info), &dwResult, NULL) ;

また、結果が出ましたらご報告させていただきます。


返信引用
NowNow
 NowNow
(@NowNow)
ゲスト
結合: 20年前
投稿: 27
 

> int i, HEADER_SIZE, HEADER_SIZE_1;
> li.LowPart = (HEADER_SIZE+HEADER_SIZE_1*i)&0x00000000FFFFFFFF;
> li.HighPart = ((HEADER_SIZE+HEADER_SIZE_1*i)&0xFFFFFFFF00000000) >> 32;
> SetFilePointerEx(hFile, li, NULL, FILE_BEGIN);

64ビットのアドレス計算が、intで行われています。
intが32ビットだとすると、正しく計算が行われていないかもしれません。

VC6で試したところ、
LONGLONG ll = 0x7FFFFFFF * 0x00000002;
が、ll = 0xfffffffffffffffeに、
LONGLONG ll = (LONGLONG)0x7FFFFFFF * 0x00000002;
が、ll = 0x00000000fffffffeになりました。
キャストをするべきかもしれません。

ところで、上位32ビットと下位32ビットを別々に代入しなくても、
li.QuadPart = (LONGLONG)HEADER_SIZE+HEADER_SIZE_1*i;
このようにしても上位下位分けて代入したのと同じ値になっているようでした。


返信引用
ももたろう
 ももたろう
(@ももたろう)
ゲスト
結合: 20年前
投稿: 11
Topic starter  

NowNowさん、みなさん

おはようございます。
無事にデータを読み込ませることが出来ました。いろいろとご教示頂き
ありがとうございました。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました