テキストファイル読み込み用クラス

これまでC# で作成してきた「SourceToHTML」を、Delphi に焼きなおしてみます。

TextReader.pas


//*******************************************************************************************************
// テキストファイル 読み込み用クラス
//*******************************************************************************************************
unit TextReader;

interface
uses
SysUtils, Classes;

type
TTextReader = class
private
textReader: TStringList;
fileName: string;
readBuffer: WideString;
lineIndex: Integer;
readIndex: Integer;
IsOpen: Boolean;
FileExists: Boolean;

procedure Close();
public
constructor Create(fileName:string);
destructor Destroy; override;
function getChar():WideChar;
end;

const
EOF: WideChar = #0;
NEWLINE:WideChar = #13;

implementation
//----------------------------------------------------------------------------------------------------
// 初期化
//----------------------------------------------------------------------------------------------------
constructor TTextReader.Create(fileName:string);
begin
self.fileName := fileName;
readBuffer := '';
readIndex := -1;
IsOpen := false;
FileExists := true;
end;
//----------------------------------------------------------------------------------------------------
// 終了
//----------------------------------------------------------------------------------------------------
destructor TTextReader.Destroy();
begin
Close();
inherited;
end;
procedure TTextReader.Close();
begin
//OPENしてたら
if (IsOpen) then
begin
//CLOSEする
textReader.Free;
IsOpen := false;
end;
end;
//---------------------------------------------------------------------------------------------------
// 入力ファイルから1文字ずつ読む
//---------------------------------------------------------------------------------------------------
function TTextReader.getChar():WideChar;
begin
//ファイルがなければ、EOFを返す
if (not FileExists) then
begin
result := EOF;
exit;
end;

//まだOPENしてなかったら
if (not IsOpen) then
begin
//ファイルがあれば
if SysUtils.FileExists(fileName) then
begin
//OPENする
textReader := TStringList.Create();
textReader.LoadFromFile(fileName);
lineIndex := -1;
IsOpen := true;
end
else
begin
//ファイルがなければ、EOFを返す
FileExists := false;
result := EOF;
exit;
end;
end;

//現在位置が初期化されていたら (読み込み用バッファが空っぽ)
if (readIndex < 0) then
begin
inc(lineIndex);

//次の行がなければ
if (lineIndex >= textReader.Count) then
begin
//ファイルがなければ、EOFを返す
result := EOF;
exit;
end;

//次の行を読む
readBuffer := textReader.Strings[lineIndex];

//現在位置を行の先頭に位置づける
readIndex := 1;
end;

//現在位置が読み込み用バッファの最後に達したら
if (readIndex > Length(readBuffer)) then
begin
//現在位置を初期化する
readIndex := -1;
//改行コードを返す
result := NEWLINE;
exit;
end;

//読み込み用バッファから1文字返し、現在位置を1つ進める
result := readBuffer[readIndex];
Inc(readIndex);
end;

end.