[リストへもどる]
一括表示

投稿時間:2002/12/21(Sat) 01:41
投稿者名:taka
Eメール:
URL :
タイトル:
ファイル反転処理
例: 中身が(バイナリでみて)「01 02 03」というファイルを 「03 02 01」にする。
というようなファイルの反転処理を試みているのですが自分でプログラムしたものだと
実行速度が遅いの(やその他の問題点もあると思うので)でこうしたほうがいいよ等
のアドバイスがあればどうぞお願いします。以下に自分でプログラムしたソースを
載せておきます。

'変数宣言
Dim in_file as string    '入力ファイル名格納用
Dim out_file as string   '出力ファイル名格納用
Dim tmp() As Byte
Dim j As Double
Dim i As Double
Dim ff1 As Integer
Dim ff2 As Integer

ff1 = FreeFile
Open in_file For Binary As #ff1
i = FileLen(in_file)  'i=入力ファイルの長さ取得
ReDim tmp(1 To i)       '入力ファイルの長さ分配列を確保
For j = i To 1 Step -1
Get #ff1, , tmp(j)      '入力ファイル最後から順番に配列の先頭から順番に1バイトずつ格納
Next
Close #ff1
ff2 = FreeFile
Open out_file For Binary As #ff2
Put #ff2, , tmp
Close #ff2

投稿時間:2002/12/21(Sat) 08:55
投稿者名:Say
Eメール:
URL :
タイトル:
Re: ファイル反転処理
ファイルの読み書きは最も遅い処理のひとつですから、
その回数を減らすのが高速化のコツです。

具体的には、
1.読込用バイト配列と書込用バイト配列を用意
2.読込用バイト配列に一気読み
3.読込用第n要素を書込用第(UBound-n)要素にコピー
3.書込用バイト配列を一気書き
です。

投稿時間:2002/12/21(Sat) 09:00
投稿者名:A221
Eメール:
URL :
タイトル:
Re: ファイル反転処理
加工している間にSayさんがレスをつけられたので
蛇足ぎみですがコードです。

Private Const in_file = "c:\text.txt"
Private Const Out_file = "c:\text2.txt"

Private Sub Form_Load()

Dim Load() As Byte
Dim swap() As Byte
Dim Flen As Long
Dim Fnum As Long
Dim tmpstr As String

Fnum = FreeFile
Open in_file For Binary As #Fnum

Flen = FileLen(in_file)
ReDim Load(1 To Flen)
ReDim swap(1 To Flen)

Load = InputB$(Flen, #Fnum)
Close #Fnum

For i = LBound(Load) To UBound(Load)
    swap(UBound(Load) - i + 1) = Load(i)
Next

Fnum = FreeFile
Open Out_file For Output As #Fnum
    Print #Fnum, StrConv(swap, vbUnicode)
Close #Fnum

End Sub

投稿時間:2002/12/21(Sat) 13:37
投稿者名:taka
Eメール:
URL :
タイトル:
Re: ありがとうございます^^
Sayさん, A221さんアドバイスありがとうございます。
早速アドバイスされたように処理を変更してみたところ
とても処理速度が上がりました。
UBoundとLBoundは,初めて知りました。
ああゆう便利な物があるとは,勉強になりました。
MSDNライブラリ暇あれば目を通したいと思います。
ありがとうございました。であであ