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

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

TextReader.h


//***************************************************************************
// テキストファイル 読み込み用クラス
//***************************************************************************
#ifndef TextReaderH
#define TextReaderH
//---------------------------------------------------------------------------
#include <Classes.hpp>
//---------------------------------------------------------------------------
class TTextReader
{
private:
const wchar_t C_EOF; // '\0'
const wchar_t C_NEWLINE; // '\n'

TStringList* textReader;
AnsiString fileName;
WideString readBuffer;
int readIndex;
int lineIndex;

bool IsFileExists;
bool IsOpen;

// ファイルのCLOSE
void __fastcall Close();

public:
// 初期化
__fastcall TTextReader(AnsiString fileName);
// 終了
_fastcall ~TTextReader();
// 入力ファイルから1文字ずつ読む
wchar_t __fastcall getChar();
};
#endif

TextReader.cpp


//*******************************************************************************************************
// テキストファイル 読み込み用クラス
//*******************************************************************************************************
#pragma hdrstop
#include <vcl.h>
#include "TextReader.h"
//-------------------------------------------------------------------------------------------------------
#pragma package(smart_init)
//-------------------------------------------------------------------------------------------------------
// 初期化
//-------------------------------------------------------------------------------------------------------
__fastcall TTextReader::TTextReader(AnsiString fileName):C_EOF(L'\0'),C_NEWLINE(L'\n')
{
IsOpen = false;
readBuffer = "";
lineIndex = -1;
readIndex = -1;
IsFileExists = true;

this->fileName = fileName;
}
//-------------------------------------------------------------------------------------------------------
// 終了
//-------------------------------------------------------------------------------------------------------
__fastcall TTextReader::~TTextReader()
{
Close();
}
//-------------------------------------------------------------------------------------------------------
// ファイルのCLOSE
//-------------------------------------------------------------------------------------------------------
void __fastcall TTextReader::Close()
{
//OPENしてたら
if (IsOpen)
{
//CLOSEする
delete textReader;
IsOpen = false;
}
}
//-------------------------------------------------------------------------------------------------------
// 入力ファイルから1文字ずつ読む
//-------------------------------------------------------------------------------------------------------
wchar_t __fastcall TTextReader::getChar()
{
//ファイルがなければ、EOFを返す
if (!IsFileExists) return C_EOF;

//まだOPENしてなかったら
if (!IsOpen)
{
//ファイルがあれば
if (FileExists(fileName))
{
//OPENする
textReader = new TStringList();
textReader->LoadFromFile(fileName);
lineIndex = -1;
IsOpen = true;
}
else
{
//ファイルがなければ、EOFを返す
IsFileExists = false;
return C_EOF;
}
}

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

//次の行がなければ
if (lineIndex >= textReader->Count) return C_EOF;

//次の行を読む
readBuffer = textReader->Strings[lineIndex];

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

//現在位置が読み込み用バッファの最後に達したら
if ((readBuffer == NULL) || (readIndex > wcslen(readBuffer)))
{
//現在位置を初期化する
readIndex = -1;
//改行コードを返す
return C_NEWLINE;
}

//読み込み用バッファから1文字返し、現在位置を1つ進める
return readBuffer[readIndex++];
}