掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ビックエンディアンするには? (ID:52680)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
> 一応動くようにはなりましたけど、ここで質問があります。 > ファイルサイズからバッファサイズを指定したいのですけど > どのようにしたら良いのでしょうか? メモリの確保・解放を自分で行うことでできます。 malloc/freeとか,new[]/delete[]とか,HeapAlloc/HeapFreeとか。 C++使っているならstd::vectorが楽です。 ただ,今回のような場合はファイルマッピングを使って処理した方が簡単だと思います。 > BUFFER_SIZEを20MBで指定して実行を行うとアドレスエラー? > らしきものが出て困っております。 スタックをオーバーしたのでしょう。 VC++のスタックは1MBなので,20MBの自動変数を確保することはできません。 ファイル全体を一度に読み込もうとせず, 何回かに分けて読み込むと良いです。 > if( hFile1 == INVALID_HANDLE_VALUE ){ > CloseHandle( hFile1 ); > return NOT_EXIST_FILE1; > } INVALID_HANDLE_VALUEをCloseHandleで閉じる必要はないですし,閉じてはいけません。 INVALID_HANDLE_VALUEはあくまでinvalidなハンドルです。 > dwFileSize1 = GetFileSize( hFile1, NULL ); せっかくファイルサイズを得たのに, > /* ファイル読み込み */ > ReadFile( hFile1, &FileData, BUFFER_SIZE, &dwRead1, NULL ); BUFFER_SIZEで読み込むのは何故? #まぁ,BUFFER_SIZE > dwFileSize1であっても問題はないのだが……。 それから,書き込む側のファイルサイズを取得するのは無駄です。 CREATE_ALWAYSした直後ですから,常に0バイトです。 > /* ビックエンディアン */ /* ビッグエンディアン */ > for( i=0; i < BUFFER_SIZE / 8; i++ ){ BUFFER_SIZEで回すのではなく,dwRead1で回すべきです。 ところで,8で割っているのは何故? > A[0] = FileData[2*i]; > B[0] = FileData[2*i+1]; > FileData[2*i] = B[0]; > FileData[2*i+1] = A[0]; BYTE temp; temp = FileData[2 * i]; FileData[2 * i] = FileData[2 * i + 1]; FileData[2 * i + 1] = temp; > /* ファイル書き込み */ > WriteFile( hFile2, &FileData, BUFFER_SIZE, &dwRead1, NULL ); 書き込みサイズはどう考えてもdwRead1だと思いますが……。 あと,書き込み失敗を考えたほうがよいです。 #本当は読み込み失敗も。
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2020 Takeshi Okamoto All Rights Reserved.