お世話になっております。
全銀手順で固定長データを送信するプログラムを作成しています。
処理の方法なのですが、
①バイナリ型配列を定義
②SLH,TTCを作成→バイナリ配列にセット
③ReadLnで読込んだテキストファイルの内容をバイナリ配列にセット
④TCliantSocketでバイナリ型配列の送信としています。
そこで質問なのですが、
上記③ではテキストファイルの内容を1BYTEずつバイナリ型に変換してセットしています。
この部分で何か効率的な方法はないでしょうか。
また、根本の部分でもっと効率的な方法があればお教え下さい。
以上よろしくお願いします。
外してたらすみません。
var
f: file;
b: byte;
begin
AssignFile(f, 'test.txt');
Reset(f,1);
BlockRead(f, b, Sizeof(b));
CloseFile(f);
end;
とあらかじめバイナリファイルとして開くのはいかがでしょうか?
Reset(),BlockRead()についてはヘルプを参照してください。
メラトニンさん書込みありがとうございます。
早速お教え頂いた方法を試してみたところ、うまくいきました。
ただ、レコードサイズ指定のブロックリードではCRLFを判断してくれないので、
CRLFを含んだレコード長(レコード長+2BYTE)の1件読みとしています。
このため、Byte型配列の末尾2バイトを省き、バッファに追加していき、伝送レコード数溜まったら伝送するという形にしました。
一方で1伝送中のレコード数は決まっているので、BlockReadで複数レコードを読み取る方法も試しましたが、
この場合も配列中からレコード分のCRLFを省いて詰めなければならず、処理的にどうなのかな??というところです。
書込んで頂いている1BYTE読込みでCRLF以外を送信バッファに溜め込むのが良いのか、いろいろ試してみたいと思います。
ちなみに、当初のループでString型を1ByteづつByte型に変換する方法よりも伝送時間は200BYTEレコード×1万件で40秒程度早くなりました。
劇的には変わりませんでしたが、改善されている??ww
ありがとうございました。
> ③ReadLnで読込んだテキストファイルの内容をバイナリ配列にセット
TStringList で読み込めば自動的に CRLF で区切られますけど。
TStringList の項目 Strings[] は String 型ですから、String 型から
byte の配列に読み込むのは、単に Move() するだけです。
procedure TForm1.Button1Click(Sender: TObject);
var
sl: TStringList;
i: Integer;
ba: array of byte;
begin
sl := TStringList.Create;
try
sl.LoadFromFile('c:\readme.htm');
for i := 0 to sl.Count-1 do
begin
if sl[i] = '' then continue;
SetLength(ba,Length(sl[i]));
Move(sl[i][1],ba[0],Length(sl[i]));
//
// ここで ba を使う
//
end;
finally
sl.Free;
end;
end;
上では TStringList の例を示しましたが、ReadLn で読み込んだ一行の String
型でも Move を使うのはまったくおなじです。
書き込みありがとうございます。
確かにいけましたww
この方法ならCRLFを意識しなくて良いので、処理が簡略化されます。
ありがとうございました。
ツイート | ![]() |