/******************************************************************************
	Trick Library
		ファイル文字列モジュールヘッダファイル
			Copyright(C) 2000 Wraith.	All rights reserved.
											Coded by Wraith in Jul 7, 2000.
******************************************************************************/

//　Tab幅を４文字に設定して表示させてください。

//	filestr.h


#ifndef		__TrickLibrary_FILESTR_H__
#define		__TrickLibrary_FILESTR_H__

#include	"clrptr.h"

//
//	■TFileString使用例：
//
//	//	ファイル"hoge.txt"への書き込み
//	TFileString("hoge.txt") = "文字列を代入するとファイルに書き込みます。\r\n";
//
//	//	ファイル"hoge.txt"の読み込み
//	std::string HogeString;
//	HogeString = TFileString("hoge.txt");
//
//	//	ファイル"hoge.txt"をファイル"copy.txt"にコピー
//	TFileString("copy.txt") = TFileString("hoge.txt");
//
//	//	ファイル"hoge.txt"をファイル"moge.log"に追記
//	TFileString("moge.log") += TFileString("hoge.txt");
//
//	//	ファイル"moge.log"への書き込み	////////////////////
//	TFileString LogFile("moge.log");
//	LogFile += "『+=』演算で追記ができます。\r\n";
//	LogFile += "こーやって続けて書き込んでもファイルのオープン・クローズ\r\n";
//	LogFile += "は一回で済みます。\r\n";
//	//	ファイル"hoge.log"を明示的に閉じる
//	//	(ほっといても参照やデストラクタのタイミングで閉じられます。)
//	//	 また閉じても必要に応じて自動で開き直します。)
//	LogFile.OnceClose();
//	//	ファイル"moge.log"への書き込み
//	(LogFile += "こんなスタイルでも・・・\r\n") += "・・・追記ができます。\r\n";
//
//	//	ファイル"hoge.txt"への読み書き	////////////////////
//	TFileString HogeText("hoge.txt");
//	char *HogeCopy = new char[strlen(HogeText) +1];	//	←まだ一度も読み込んでいないのでここでは読み込み
//	strcpy(HogeCopy, HogeText);						//	←ここではさっき読んだ文字列を返すだけ
//	delete []HogeCopy;
//	HogeText += "ほげほげ〜\r\n";					//	←ここで書き込み
//	char *HogeCopy2 = new char[strlen(HogeText) +1];//	←書き込みが行われたのでここでは読み込み直す
//	strcpy(HogeCopy2, HogeText);					//	←ここではさっき読んだ文字列を返すだけ
//	delete []HogeCopy2;
//	//		・・・強制的に再読み込みをしたい場合はTFileString::Read()を使用してください。
//
//
//	・・・ようはメモリの替わりに指定されたファイルに文字列を記憶する
//	文字列クラスだと思ってもらって差し支えないです。
//

#if			defined(__WIN32__) || defined(_WIN32)

#include	<windows.h>

class TFileString {
	private:
		const char	*FileName;
		HANDLE		FileHandle;
		char		*Buffer;

	public:
				TFileString(const char *_FileName) {
					FileName = _FileName;
					FileHandle = NULL;
					Buffer = NULL;
				}
				~TFileString() {
					TClearPointer_Close(FileHandle);
					TClearPointer_Array(Buffer);
				}

TFileString &	Write(const char *_Buffer, bool IsAdd = false);
const char	*	Read(bool ForceRead = true);

TFileString &	operator=(const char *_Buffer) {
					return Write(_Buffer);
				}
TFileString &	operator+=(const char *_Buffer) {
					return Write(_Buffer, true);
				}
TFileString &	operator=(const TFileString &Data) {
					return Write((const char *)Data);
				}
TFileString &	operator+=(const TFileString &Data) {
					return Write((const char *)Data, true);
				}
TFileString &	OnceClose() {
					TClearPointer_Close(FileHandle);
					return *this;
				}
				operator const char	*() const {
					return ((TFileString *)(this))->Read(false);
				}
const char &	operator[](const int Index) const {
					return (((TFileString *)(this))->Read(false))[Index];
				}
};

#else	//	defined(__WIN32__) || defined(_WIN32)

#include	<stdio.h>

class TFileString {
	private:
		const char	*FileName;
		FILE		*FileHandle;
		char		*Buffer;

	public:
				TFileString(const char *_FileName) {
					FileName = _FileName;
					FileHandle = NULL;
					Buffer = NULL;
				}
				~TFileString() {
					TClearPointer_FILE(FileHandle);
					TClearPointer_Array(Buffer);
				}

TFileString &	Write(const char *_Buffer, bool IsAdd = false);
const char	*	Read(bool ForceRead = true);

TFileString &	operator=(const char *_Buffer) {
					return Write(_Buffer);
				}
TFileString &	operator+=(const char *_Buffer) {
					return Write(_Buffer, true);
				}
TFileString &	operator=(const TFileString &Data) {
					return Write((const char *)Data);
				}
TFileString &	operator+=(const TFileString &Data) {
					return Write((const char *)Data, true);
				}
TFileString &	OnceClose() {
					TClearPointer_FILE(FileHandle);
					return *this;
				}
				operator const char	*() const {
					return ((TFileString *)(this))->Read(false);
				}
const char &	operator[](const int Index) const {
					return (((TFileString *)(this))->Read(false))[Index];
				}
};

#endif	//	defined(__WIN32__) || defined(_WIN32)

#endif	//	__TrickLibrary_FILESTR_H__

/******************************************************************************
	□■□■ Wraith the Trickster ≫ http://mx1.tiki.ne.jp/~wraith/ □■□■
	■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
******************************************************************************/
