Delphiでテキストファイルの読み込み方法は色々あるが、一長一短なので、場合によって使い分ける。
TStreamReaderかTFileを使うのが普通だと思うが、ロックされたファイルの読込ができないという問題がある。
|
TStreamReader |
TFile |
AssignFile |
ロックされたファイルの読込 |
× |
× |
○ |
全文読込 |
○ |
○ |
× |
一行毎読込 |
○ |
× |
○ |
文字コード対応 |
△ |
△ |
△ |
はじめから読み直し(Reset) |
× |
× |
○ |
- 改行コードはすべてCRLF,LFに対応している
- TStringList.LoadFromFile()はTFileとほぼ同じ
エンコードについて
|
TStreamReader |
TFile |
AssignFile |
Ascii |
○ |
○ |
○ |
SJIS |
△ |
○ |
○ |
UTF-8(BOMなし) |
○ |
△ |
× |
UTF-8(BOMあり) |
○ |
○ |
× |
- ○は文字コードの指定なしで読み込める
- △は文字コードの指定なしでは読み込めないが、指定すれば読み込める
TStreamReader使用例
try
sr := TStreamReader.Create(filename);
str := sr.ReadToEnd(); //全文string読込(ここでも文字コードの例外が飛ぶ可能性あり)
while not sr.EndOfStream do //(ここでも文字コードの例外が飛ぶ可能性あり)
begin
line := sr.ReadLine; //一行読込
end;
except
on e: Exception do
begin
ShowMessage('ERROR:' + e.Message);
exit;
end;
end;
sr.Free();
sl := TStringList.Create();
sl.Text := str; //全文TStringList読込はないのでstringを代入
TFile使用例
try
str := TFile.ReadAllText(filename); //全文string読込
sa := TFile.ReadAllLines(filename); //全文TStringDynArray読込
except
on e: Exception do
begin
ShowMessage('ERROR:' + e.Message);
exit;
end;
end;
AssignFile使用例
AssignFile(f, filename);
try
Reset(f);
except
on e: Exception do
begin
ShowMessage('ERROR:' + e.Message);
exit;
end;
end;
while not Eof(f) do
begin
ReadLn(f, line); //一行読込
end;
CloseFile(f); // Resetで例外が飛んでもその後の処理を行う場合は、
// CloseFileでも例外が飛ぶので、tryでくくる必要があるので注意