はじめに
文字列とファイルと複数行文字列についての小ネタです。
文字列とファイルと複数行文字列
複雑な処理を伴わない時に、変数の内容をファイルに書き出したり、その逆をやりたい場合の Tips です。
■ 文字列型変数の内容をファイルにしてセーブする
String 型変数の中身をファイルに保存するには TFile.WriteAllText()
を使うのが簡単です。次の例は Hello.txt
に Hello, world.
を UTF-8 で保存します。
uses
.., System.IOUtils;
...
var s := 'Hello, world.';
TFile.WriteAllText('Hello.txt', s, TEncoding.UTF8);
2 番目のパラメータは値パラメータなので、文字列リテラルでも構いません。
■ ファイルの内容を文字列型変数にロードする
逆にファイルの内容を String 型変数に読み込むには TFile.ReadAllText()
を使います。
uses
.., System.IOUtils;
...
var s := TFile.ReadAllText('Hello.txt', TEncoding.UTF8);
■ バイナリファイルは?
WriteAllBytes()
/ ReadAllBytes()
を使います。Buf は TBytes 型です。
uses
.., System.IOUtils;
...
var Buf := TEncoding.UTF8.GetBytes('Hello, world.');
TFile.WriteAllBytes('Hello.bin', Buf);
uses
.., System.IOUtils;
...
var Buf := TFile.ReadAllBytes('Hello.bin');
■ 複数行文字列
複数行文字列を構成するのに最もシンプルなのは、文字列リテラルで記述する方法です。
var s := 'Hello,' + sLineBreak +
' world.';
ShowMessage(s);
TStringList と無名メソッドを使った複数行文字列です。ファイルの読み書きを伴うなら TStringList だけでいいかも。
var s := (function: string
begin
with TStringList.Create do
begin
Add('Hello,');
Add(' world.');
result := Text;
Free;
end;
end)();
ShowMessage(s);
TStringBuilder を使った複数行文字列です。メソッドチェーンで複数行文字列を構築できます。
var sb := TStringBuilder.Create.
AppendLine('Hello,').
AppendLine(' world.');
ShowMessage(sb.ToString);
sb.Free;
TStringHelper と動的配列を使った複数行文字列です。
var s := string.Join(sLineBreak,
['Hello,',
' world.']);
ShowMessage(s);
複数行文字列はファイル出力用だけでなく、TLabel にセットする複数行ラベルを生成するのにも使えます。
■ 真の複数行文字列
Delphi 12 以降だと 3 重引用符を使った複数行文字列が使えます。
uses
.., System.IOUtils;
...
var s := '''
Hello,
world.
''';
TFile.WriteAllText('Hello.txt', s, TEncoding.UTF8);
インデント位置は開始 3 重引用符のある行の先頭になります (例では v
の位置)。SQL 文を書くのが簡単になりますね。
おわりに
ちょっとしたファイルの読み書きが必要な事があるんですよね。
- 無名メソッドは Delphi 2009 以降で使えます
-
TStringBuilder
は Delphi 2009 以降で使えます -
System.IOUtils
は Delphi 2010 以降で使えます -
TStringHelper
は Delphi XE3 以降で使えます - 配列定数式 は Delphi XE7 以降で使えます
- インライン変数宣言と型推論 は Delphi 10.3 Rio 以降で使えます
- 複数行文字列は Delphi 12 以降で使えます