XP+Delphi2007を使用しています。
現在はある文字列をテキストファイルへ保存する場合、
var
fn:textfile;
begin
AssignFile(fn,'C:\test.txt');
rewrite(fn);
writeln(fn,'あいうえお');
writeln(fn,'かきくけこ');
closefile(fn);
というように作成しています。
しかし、最近になって(ようやく?)TStringList.SaveToFileという
ものを知り、以下のように作成し、どのような違いが
あるのか試してみました。
var
SL:TStringList;
begin
SL:=TStringList.Create;
try
SL.Add('あいうえお');
SL.Add('かきくけこ');
SL.SaveToFile('C:\test.txt');
finally
SL.Free;
end;
両者の違いは私が調べる限り以下の様だったのですが、これらは
正しいでしょうか、また以下以外にもあれば教えていただけますしょうか。
【AssignFile+rewrite】
1.処理が遅い
2.コードの指定は不可。
3.保存文字列が配列の場合(上記では直接指定ですが)、動的配列を
用意してさらにsetlength()でメモリ(要素)を確保する必要がある。
(この確保の失敗でエラーとなることが多いです^^;)
4.appendで追記が可能。
5.開放は不要
(プロシージャ内では動的配列の開放はしていないのですが、これは間違い?)
6.メモリの消費量が少ない。
【TStringList.SaveToFile】
1.処理が速い。
2.コードを指定して保存できる。
3.保存文字列が配列の場合、StringListにAddしてしまえばいい。
4.SaveToFileでは新規作成か上書きしかできない。
5.最後に開放(free)しないといけない。
6.メモリを無駄に消費する。
保存する内容によって「TStringList.SaveToFile」を取り入れようと考えて
います。どうぞよろしくお願いします。
川上@電助システムズ
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hATVC
-----------------------------------------------------[freeml by GMO]--
川上さん:
> 現在はある文字列をテキストファイルへ保存する場合、
> var
> fn:textfile;
> begin
> AssignFile(fn,'C:\test.txt');
> rewrite(fn);
> writeln(fn,'あいうえお');
> writeln(fn,'かきくけこ');
> closefile(fn);
>
> というように作成しています。
>
> しかし、最近になって(ようやく?)TStringList.SaveToFileという
> ものを知り、……どのような違いがあるのか試してみました。
> 両者の違いは私が調べる限り以下の様だったのですが、これらは
> 正しいでしょうか、また以下以外にもあれば教えていただけます
> でしょうか。
>
> 【AssignFile+rewrite】
> 1.処理が遅い
> 2.コードの指定は不可。
> 3.保存文字列が配列の場合(上記では直接指定ですが)、動的配列を
> 用意してさらにsetlength()でメモリ(要素)を確保する必要がある。
> 4.appendで追記が可能。
> 5.開放は不要
> 6.メモリの消費量が少ない。
>
> 【TStringList.SaveToFile】
> 1.処理が速い。
> 2.コードを指定して保存できる。
> 3.保存文字列が配列の場合、StringListにAddしてしまえばいい。
> 4.SaveToFileでは新規作成か上書きしかできない。
> 5.最後に開放(free)しないといけない。
> 6.メモリを無駄に消費する。
>
> 保存する内容によって「TStringList.SaveToFile」を取り入れようと
> 考えています。どうぞよろしくお願いします。
できるだけ TStringList.SaveToFile をお使いになることを
お勧めします。 後者には欠点がほとんどありません。 後者の
欠点として挙げてくださったものにコメントしますと──
4.新規作成か上書きしかできない。
もし追記をしたければ、事前に LoadFromFile() を呼んで
おけばいいのです。
5.最後に開放しないといけない。
どうという手間ではないですね。 AssignFile の方でも、
CloseFile は必要ですし。
6.メモリを無駄に消費する。
ファイルが大きい場合など、確かに問題になりますね。 その
場合には TFileStream をお使いください。 ファイルの中身を
丸ごとメモリに置かずにすみます。
TFileStream にはディスクキャッシュ(ディスクへの読み書きを
まとめて行う)機能がないので、1行単位の書き出しはそんなに
速くありません。 しかし TStringList と組み合わせて使うと、
メモリ使用量と速度をうまく折り合わせることができます。
つまり TStringList を一種のバッファとして使い、一定の行数
(数千~数万行)がたまったら、TFileStream に内容を送って
一気にディスクに書き出させるようにすると、そんなにメモリを
食わずに高速でファイル出力ができるようになります。
TFileStream の派生クラスにキャッシュ機能を持たせることも
そんなに難しくありません。 一つ用意しておくと重宝しますよ
(もしご入用でしたらさし上げますので、どなたでもご連絡ください)。
――――――――――――――――――――――――――――――――――――
株式会社イマジオム 代表取締役 高木太郎
〒316-0024 茨城県 日立市 水木町 1-11-10
電話:0294-28-0147
ファクシミリ:0294-28-0148
電子メール:tarou_...@imageom.co.jp
ホームページ:http://www.imageom.co.jp/
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
練習や試合の予定調整は「とっとと決め太郎」におまかせ!
http://ad.freeml.com/cgi-bin/sa.cgi?id=hAXyW
ご回答ありがとうございました。
順次 TStringList.SaveToFile に置き換えていこうと思います。
川上
MLホームページ: http://www.freeml.com/delphi-users
----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hBXt5
------------------------------------------------------[freeml byGMO]--