[delphi-users:2347] テキストファイルへの保存について

2,831 views
Skip to first unread message

じゃぺ

unread,
Dec 1, 2011, 9:39:44 PM12/1/11
to delphi...@freeml.com
いつもお世話になっています
川上と申します。

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]--

高木太郎

unread,
Dec 2, 2011, 1:09:03 AM12/2/11
to delphi...@freeml.com
こんにちは、イマジオムの高木です。

川上さん:


> 現在はある文字列をテキストファイルへ保存する場合、
> 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

じゃぺ

unread,
Dec 6, 2011, 12:07:55 AM12/6/11
to delphi...@freeml.com
高木様

ご回答ありがとうございました。
順次 TStringList.SaveToFile に置き換えていこうと思います。

川上


MLホームページ: http://www.freeml.com/delphi-users

----------------------------------------------------------------------
メールだけでみんなを招待できる便利機能♪
http://ad.freeml.com/cgi-bin/sa.cgi?id=hBXt5
------------------------------------------------------[freeml byGMO]--

Reply all
Reply to author
Forward
0 new messages