dcdd144598 2011-02-23 kinaba: #ifndef _KILIB_TEXTFILE_H_ dcdd144598 2011-02-23 kinaba: #define _KILIB_TEXTFILE_H_ dcdd144598 2011-02-23 kinaba: #include "types.h" dcdd144598 2011-02-23 kinaba: #include "ktlaptr.h" dcdd144598 2011-02-23 kinaba: #include "memory.h" dcdd144598 2011-02-23 kinaba: #include "file.h" dcdd144598 2011-02-23 kinaba: #ifndef __ccdoc__ dcdd144598 2011-02-23 kinaba: namespace ki { dcdd144598 2011-02-23 kinaba: #endif dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ @pkg ki.StdLib //@} dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 利用可能コードセット dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // ただし、ここでリストアップされたもののうち、Windowsにちゃんと dcdd144598 2011-02-23 kinaba: // 言語サポートがインストールされているものだけが実際には対応可能。 dcdd144598 2011-02-23 kinaba: // 値が-100より小さいコードは、そのすぐ上にあるコードページの言語 dcdd144598 2011-02-23 kinaba: // サポートを利用して変換を行うため、それに依存する。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: enum charset { dcdd144598 2011-02-23 kinaba: AutoDetect = 0, // 自動判定 dcdd144598 2011-02-23 kinaba: // SJIS/EucJP/IsoJP/IsoKR/IsoCN dcdd144598 2011-02-23 kinaba: // UTF5/UTF8/UTF8N/UTF16b/UTF16l/UTF32b/UTF32l dcdd144598 2011-02-23 kinaba: // を判定する。他は知らない。(^^; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Western = 1252, // 欧米 (Windows1252 >> ISO-8859-1) dcdd144598 2011-02-23 kinaba: Turkish = 1254, // トルコ語 (Windows1254 >> ISO-8859-9) dcdd144598 2011-02-23 kinaba: Hebrew = 1255, // ヘブライ語(Windows1255 >> ISO-8859-8) dcdd144598 2011-02-23 kinaba: Arabic = 1256, // アラビア語(Windows1256 〜 ISO-8859-6) dcdd144598 2011-02-23 kinaba: Baltic = 1257, // バルト語 (Windows1257 >> ISO-8859-13) dcdd144598 2011-02-23 kinaba: Vietnamese = 1258, // ベトナム語(Windows1258 != VISCII) dcdd144598 2011-02-23 kinaba: Central = 1250, // 中央ヨーロッパ(Windows1250 〜 ISO-8859-2) dcdd144598 2011-02-23 kinaba: Greek = 1253, // ギリシャ語(Windows1253 〜 ISO-8859-7) dcdd144598 2011-02-23 kinaba: Thai = 874, // タイ語 dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: Cyrillic = 1251, // キリル語(Windows1251 != ISO-8859-5) dcdd144598 2011-02-23 kinaba: Koi8R = 20866,// キリル語(KOI8-R) dcdd144598 2011-02-23 kinaba: Koi8U = 21866,// キリル語(KOI8-U ウクライナ系) dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UHC = 949, // 韓国語1 (Unified Hangle Code >> EUC-KR) dcdd144598 2011-02-23 kinaba: IsoKR = -950, // 韓国語2 (ISO-2022-KR) dcdd144598 2011-02-23 kinaba: Johab = 1361, // 韓国語3 (Johab) dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: GBK = 936, // 中国語1 (簡体字 GBK >> EUC-CN) dcdd144598 2011-02-23 kinaba: IsoCN = -936, // 中国語2 (簡体字 ISO-2022-CN) dcdd144598 2011-02-23 kinaba: HZ = -937, // 中国語3 (簡体字 HZ-GB2312) dcdd144598 2011-02-23 kinaba: Big5 = 950, // 中国語4 (繁体字 Big5) dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: SJIS = 932, // 日本語1 (Shift_JIS) dcdd144598 2011-02-23 kinaba: EucJP = -932, // 日本語2 (日本語EUC) dcdd144598 2011-02-23 kinaba: IsoJP = -933, // 日本語3 (ISO-2022-JP) dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: UTF5 = -2, // Unicode (UTF-5) : BOM無し dcdd144598 2011-02-23 kinaba: UTF7 = 65000,// Unicode (UTF-7) : BOM無し dcdd144598 2011-02-23 kinaba: UTF8 =-65001,// Unicode (UTF-8) : BOM有り dcdd144598 2011-02-23 kinaba: UTF8N = 65001,// Unicode (UTF-8N) : BOM無し dcdd144598 2011-02-23 kinaba: UTF16b = -3, // Unicode (UTF-16) : BOM有り BE dcdd144598 2011-02-23 kinaba: UTF16l = -4, // Unicode (UTF-16) : BOM有り LE dcdd144598 2011-02-23 kinaba: UTF16BE = -5, // Unicode (UTF-16BE): BOM無し dcdd144598 2011-02-23 kinaba: UTF16LE = -6, // Unicode (UTF-16LE): BOM無し dcdd144598 2011-02-23 kinaba: UTF32b = -7, // Unicode (UTF-32) : BOM有り BE dcdd144598 2011-02-23 kinaba: UTF32l = -8, // Unicode (UTF-32) : BOM有り LE dcdd144598 2011-02-23 kinaba: UTF32BE = -9, // Unicode (UTF-32BE): BOM無し dcdd144598 2011-02-23 kinaba: UTF32LE = -10, // Unicode (UTF-32LE): BOM無し dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: DOSUS = 437 // DOSLatinUS (CP437) dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 改行コード dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: enum lbcode { dcdd144598 2011-02-23 kinaba: CR = 0, dcdd144598 2011-02-23 kinaba: LF = 1, dcdd144598 2011-02-23 kinaba: CRLF = 2 dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: struct TextFileRPimpl; dcdd144598 2011-02-23 kinaba: struct TextFileWPimpl; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // テキストファイル読込 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // ファイルを指定された文字コードで解釈し、Unicode文字列として dcdd144598 2011-02-23 kinaba: // 一行毎に返す。文字コードや改行コードの自動判定も可能。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class TextFileR : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ(コード指定)//@} dcdd144598 2011-02-23 kinaba: TextFileR( int charset=AutoDetect ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ デストラクタ //@} dcdd144598 2011-02-23 kinaba: ~TextFileR(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 開く //@} dcdd144598 2011-02-23 kinaba: bool Open( const TCHAR* fname ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 閉じる //@} dcdd144598 2011-02-23 kinaba: void Close(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // 読み込み (読んだ長さを返す) dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // 少なくとも20くらいのサイズを確保したバッファを指定してください。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: size_t ReadLine( unicode* buf, ulong siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 読んでるファイルのコードページ //@} dcdd144598 2011-02-23 kinaba: int codepage() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 改行コード (0:CR, 1:LF, 2:CRLF) //@} dcdd144598 2011-02-23 kinaba: int linebreak() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 読み込み状況 (0:EOF, 1:EOL, 2:EOB) //@} dcdd144598 2011-02-23 kinaba: int state() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ ファイルサイズ //@} dcdd144598 2011-02-23 kinaba: ulong size() const; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 改行が一個も見つからなかったフラグ //@} dcdd144598 2011-02-23 kinaba: bool nolb_found() const; dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dptr<TextFileRPimpl> impl_; dcdd144598 2011-02-23 kinaba: FileR fp_; dcdd144598 2011-02-23 kinaba: int cs_; dcdd144598 2011-02-23 kinaba: int lb_; dcdd144598 2011-02-23 kinaba: bool nolbFound_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: int AutoDetection( int cs, const uchar* ptr, ulong siz ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(TextFileR); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //------------------------------------------------------------------------- dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline int TextFileR::codepage() const dcdd144598 2011-02-23 kinaba: { return cs_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline int TextFileR::linebreak() const dcdd144598 2011-02-23 kinaba: { return lb_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline ulong TextFileR::size() const dcdd144598 2011-02-23 kinaba: { return fp_.size(); } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: inline bool TextFileR::nolb_found() const dcdd144598 2011-02-23 kinaba: { return nolbFound_; } dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: //@{ dcdd144598 2011-02-23 kinaba: // テキストファイル書込 dcdd144598 2011-02-23 kinaba: // dcdd144598 2011-02-23 kinaba: // Unicode文字列を受け取り、指定された文字コードに変換しながら出力する。 dcdd144598 2011-02-23 kinaba: //@} dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: class TextFileW : public Object dcdd144598 2011-02-23 kinaba: { dcdd144598 2011-02-23 kinaba: public: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ コンストラクタ(文字,改行コード指定)//@} dcdd144598 2011-02-23 kinaba: TextFileW( int charset, int linebreak ); dcdd144598 2011-02-23 kinaba: ~TextFileW(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 開く //@} dcdd144598 2011-02-23 kinaba: bool Open( const TCHAR* fname ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 閉じる //@} dcdd144598 2011-02-23 kinaba: void Close(); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //@{ 一行書き出し //@} dcdd144598 2011-02-23 kinaba: void WriteLine( const unicode* buf, ulong siz, bool lastline ); dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dptr<TextFileWPimpl> impl_; dcdd144598 2011-02-23 kinaba: FileW fp_; dcdd144598 2011-02-23 kinaba: const int cs_; dcdd144598 2011-02-23 kinaba: const int lb_; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: private: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: NOCOPY(TextFileW); dcdd144598 2011-02-23 kinaba: }; dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: //========================================================================= dcdd144598 2011-02-23 kinaba: dcdd144598 2011-02-23 kinaba: } // namespace ki dcdd144598 2011-02-23 kinaba: #endif // _KILIB_TEXTFILE_H_