2021-05-06 21:04:46
Re②:ファイルの書き換え
ストリームで処理する場合の定番としては、
・ブロックサイズ(1回の読み書きのサイズ)を決める ・ブロックサイズ分のメモリを確保(文字列変数に確保する) ・ストリームを開く ・ストリームからブロックサイズ分読む ・必要ならば、読み込んだ内容を加工する ・読み込めて処理したサイズ分、ストリームに書き込む ・以上、ストリームから読めなくなるまで繰り返す ・ストリームを閉じる です。 加工内容にもよりますが、1バイトづつ処理するか、4バイト単位で処理するか、になります。 (バイト単位で前のデータに依存するなら、バイト単位、依存しないならば、4バイトづつ とか) また、ブロックサイズで読み書きする場合と、4バイト単位で処理する場合のどちらの場合も ですが、端数のデータをどうするかを考慮してプログラミングする必要があります。 が、それに見合うだけ、処理性能は上がるはずです(なので、定番となる) 1ブロック1024バイトにしてやってみました。 1回のバイナリ取得は「INT」で4バイト。 残りがブロックサイズ未満になったら1バイトずつ処理(プログラム簡略のため) 早くなった気がします。 ~上略~ ブロックサイズは1024 1でループ pos=h1のファイルストリーム位置取得 もしsize<=posならば、抜ける もしsize-ブロックサイズ>posならば bin=h1でブロックサイズをファイルストリーム読む ブロックサイズ/4 回 r=1+(回数-1)*4 //取得・書き込み先 1,5,9,13… val=binのrを「INT」でバイナリ取得 val=XOR(val,$FFFFFFFF) valをbinのrに「INT」でバイナリ設定 h2でbinをファイルストリーム書く 違えば bin=h1で1をファイルストリーム読む 1回 val=binの1を「BYTE」でバイナリ取得 val=XOR(val,$FF) valをbinの1に「BYTE」でバイナリ設定 h2でbinをファイルストリーム書く ~以下略~ INTって4バイト? 本当? 決め打ちでよい? 一度にもっとたくさん取れない? XORも$FFFFFFFFFFFFFFFFとやればいいんじゃないの? などの疑問はあるのでもうちょっとコメント待ちしてみます。 |