日本語プログラミング言語なでしこの公式掲示板

なでしこ の 掲示板

トップ 新規 検索

2021-05-06 21:04:46

Re②:ファイルの書き換え

TKI さん

ストリームで処理する場合の定番としては、
・ブロックサイズ(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とやればいいんじゃないの?
などの疑問はあるのでもうちょっとコメント待ちしてみます。

(編集パスワード送信)

子記事

親記事 (No.1036)
返信した記事(元) (No.1037)

この内容(No.1042)に返信

この内容(No.1042)をダウンロード

この内容(No.1042)のテキスト表示





www.eznavi.net