9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Delphiでのテキストファイルの読み込みについて

Posted at

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でくくる必要があるので注意
9
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?