nlib
nn::nlib::TextReader クラス

ストリームからテキストを読み込むクラスです。 [詳解]

#include "nn/nlib/TextReader.h"

公開メンバ関数

errno_t Open (InputStream *stream) noexcept
 ストリームを与えてテキストリーダーをオープンします。 [詳解]
 
int Read () noexcept
 ストリームから1文字を読み込み、UTF-32で返します。 [詳解]
 
int Peek () noexcept
 ストリームの先頭の1文字を、UTF-32で返します。 [詳解]
 
int SkipWs () noexcept
 ストリーム内の空白(スペース,改行,タブ,復帰)文字を読み飛ばして、読み飛ばした空白の数を返します。 [詳解]
 
bool ReadUntil (size_t *len, nlib_utf8_t *buf, size_t n, char delim) noexcept
 delim まで最大n バイトのUTF-8文字列を読み込みbuf に格納します。 [詳解]
 
template<size_t N>
bool ReadUntil (size_t *len, nlib_utf8_t(&buf)[N], char delim) noexcept
 上記関数のテンプレートオーバーロードです。
 
template<class T >
bool ReadUntil (size_t *len, nlib_utf8_t *buf, size_t n, T pred) noexcept
 最大n バイトのUTF-8文字列を読み込みbuf に格納します。 [詳解]
 
template<class T , size_t N>
bool ReadUntil (size_t *len, nlib_utf8_t(&buf)[N], T pred) noexcept
 上記関数のテンプレートオーバーロードです。 [詳解]
 
size_t ReadDecimalString (char *buf, size_t n) noexcept
 0-9までの文字を最大n 文字まで読み込みbuf に格納します。 [詳解]
 
template<size_t N>
size_t ReadDecimalString (char(&buf)[N]) noexcept
 上記関数のテンプレートオーバーロードです。
 
bool Proceed (const nlib_utf8_t *str, size_t n) noexcept
 文字列str の分だけストリームを進めます。 [詳解]
 
bool Proceed (char c) noexcept
 文字c の分だけストリームを進めます。 [詳解]
 
bool ProceedEx (const nlib_utf8_t *str) noexcept
 文字列str の分だけストリームを進めます。文字列の長さ制限はありませんが、一致しない場合もストリームの位置が変更される可能性があります。 [詳解]
 
bool Close () noexcept
 テキストリーダーをクローズします。 [詳解]
 
void SetError (errno_t e) const noexcept
 エラー値を設定します。 [詳解]
 
errno_t GetErrorValue () const noexcept
 読み込みが失敗した際に、エラーの原因を取得できます。 [詳解]
 
InputStreamGetStream () noexcept
 テキストリーダーが書き込みを行うストリームを取得します。 [詳解]
 
int GetLine () const noexcept
 現在の行番号を取得します。 [詳解]
 
int GetColumn () const noexcept
 現在の桁を取得します。 [詳解]
 
 operator bool () const
 オブジェクトが初期化済みで内部でエラーが発生していなければtrue、発生していればfalseを返します。
 
コンストラクタ、デストラクタ、及び初期化
 TextReader () noexcept
 デフォルトコンストラクタです。実行後Init()による初期化を必要とします。
 
virtual ~TextReader () noexcept
 デストラクタです。 ストリームはクローズされません。
 
errno_t Init () noexcept
 オブジェクトを初期化します。成功した場合は0を返します。 [詳解]
 

詳解

ストリームからテキストを読み込むクラスです。

説明
ストリームからUTF-8の文字列を読みだして、UTF-32かUTF-16で1文字ずつ取得することができます。
改行文字列については以下のように加工されます。
  • CRLFLFとして渡されます。
  • CRLFとして渡されます。
  • LFLFとして渡されます。
また、冗長なUTF-8を検出した場合は、エラー(EILSEQ)になります。 U+D800-U+DFFFに対応するUTF-8を検出した場合もエラー(EILSEQ)になります。
以下がコード例です。ストリームよりもTextReaderを先にクローズする(もしくはデストラクトする)必要があることに注意してください。
const char* str = "\xf0\x9f\xa4\xa9\xf0\x9f\xa7\x9d multibyte";
SUCCEED_IF(reader.Init() == 0);
SUCCEED_IF(reader.Open(&is) == 0);
int c;
while ((c = reader.Read()) >= 0) {
nlib_printf("U+%05x ", c);
}
nlib_printf("\n");
(void)reader.Close();
(void)is.Close();
/*
Output:
U+1f929 U+1f9dd U+00020 U+0006d U+00075 U+0006c U+00074 U+00069 U+00062 U+00079 U+00074 U+00065
*/
TextReaderを継承し、FillBuffer_()メンバ関数をオーバーライドすることによって、UTF-8テキストのチェックを追加することができます。 TextReaderクラスではUTF-8が有効かどうかと改行コードの処理を行っています。
派生クラスでの実装の概略を以下に示します。
virtual void DerivedClass::FillBuffer() NLIB_NOEXCEPT {
TextReader::FillBuffer_();
// GetCur()からGetBufEnd()までに文字列がバッファされている。
// これらをチェックして加工し、エラーを発生させたりすることができる。
// 文字数が減る場合は、SetBufEnd()メンバ関数で設定が必要。
// 文字数を増やすことはできない。
}

TextReader.h33 行目に定義があります。

関数詳解

◆ Close()

nn::nlib::TextReader::Close ( )
noexcept

テキストリーダーをクローズします。

戻り値
常にtrueを返します。
説明
ストリームへの参照をクリアしてテキストリーダーをクローズし、ベースストリームを切り離します。 この操作ではベースストリームはクローズされません。

◆ GetColumn()

nn::nlib::TextReader::GetColumn ( ) const
inlinenoexcept

現在の桁を取得します。

戻り値
1から始まる現在の桁数
説明
ストリームが開かれていない場合は0を返し、エラーEBADFを設定します。

TextReader.h95 行目に定義があります。

◆ GetErrorValue()

nn::nlib::TextReader::GetErrorValue ( ) const
inlinenoexcept

読み込みが失敗した際に、エラーの原因を取得できます。

戻り値
0エラーは発生していません。
EINVAL引数が間違っている。
EEXIST初期化を2重に行おうとした。
EBADF読み込みストリームが存在しない。
EIO何らかの原因でストリームからの読み取りに失敗した。
EILSEQ不正な文字が見つかった。

TextReader.h92 行目に定義があります。

◆ GetLine()

nn::nlib::TextReader::GetLine ( ) const
inlinenoexcept

現在の行番号を取得します。

戻り値
1から始まる現在の行数

TextReader.h94 行目に定義があります。

◆ GetStream()

nn::nlib::TextReader::GetStream ( )
inlinenoexcept

テキストリーダーが書き込みを行うストリームを取得します。

戻り値
ストリームへのポインタ

TextReader.h93 行目に定義があります。

◆ Init()

nn::nlib::TextReader::Init ( )
noexcept

オブジェクトを初期化します。成功した場合は0を返します。

戻り値
0成功した場合
EALREADY既に初期化済みの場合

◆ Open()

nn::nlib::TextReader::Open ( InputStream stream)
noexcept

ストリームを与えてテキストリーダーをオープンします。

引数
[in]streamストリーム
戻り値
0成功した場合
EINVALストリームがNULLの場合、又はstreamIsMarkSupported()メンバ関数がfalseを返す場合。
EEXIST既にオープン済みの場合
説明
BOM付きUTF-8の場合はBOMの部分を読み飛ばします。

◆ Peek()

nn::nlib::TextReader::Peek ( )
noexcept

ストリームの先頭の1文字を、UTF-32で返します。

戻り値
読み取った文字(UTF-32)。ストリームの終端に達した場合やエラーの場合は-1。

◆ Proceed() [1/2]

nn::nlib::TextReader::Proceed ( const nlib_utf8_t str,
size_t  n 
)
noexcept

文字列str の分だけストリームを進めます。

引数
[in]strUTF-8文字列へのポインタ
[in]n文字列長(バイト)
戻り値
trueストリームの先頭がstr に一致した場合
falseそうでない場合。
説明
ストリームの先頭がstr に一致した場合、ストリームをその分だけ読み進めます。 一致しなかった場合、ストリームは現在位置のままです。
str の文字列長は200以内で、改行を含まない有効なUTF-8である必要があります。 str がそうでない場合の動作は不定です。

◆ Proceed() [2/2]

nn::nlib::TextReader::Proceed ( char  c)
inlinenoexcept

文字c の分だけストリームを進めます。

引数
[in]c読み飛ばす文字
戻り値
trueストリームの先頭がc に一致した場合
falseそうでない場合
説明
ストリームの先頭がc に一致した場合、ストリームをその分だけ読み進めます。 一致しなかった場合、ストリームは現在位置のままです。
c はASCII文字である必要があり、更に改行文字でない必要があります。

TextReader.h77 行目に定義があります。

◆ ProceedEx()

nn::nlib::TextReader::ProceedEx ( const nlib_utf8_t str)
noexcept

文字列str の分だけストリームを進めます。文字列の長さ制限はありませんが、一致しない場合もストリームの位置が変更される可能性があります。

引数
[in]strUTF-8文字列へのポインタ
戻り値
trueストリームの先頭がstr に一致した場合
falseそうでない場合。
説明
str は改行を含まない有効なUTF-8である必要があります。

◆ Read()

nn::nlib::TextReader::Read ( )
noexcept

ストリームから1文字を読み込み、UTF-32で返します。

戻り値
読み取った文字(UTF-32)。ストリームの終端に達した場合やエラーの場合は-1。

◆ ReadDecimalString()

nn::nlib::TextReader::ReadDecimalString ( char *  buf,
size_t  n 
)
noexcept

0-9までの文字を最大n 文字まで読み込みbuf に格納します。

引数
[out]buf文字列が格納されるバッファ
[in]nバッファサイズ
戻り値
読み込んだ文字数
説明
buf はヌル文字で終端されることはありません。

◆ ReadUntil() [1/3]

nn::nlib::TextReader::ReadUntil ( size_t *  len,
nlib_utf8_t buf,
size_t  n,
char  delim 
)
noexcept

delim まで最大n バイトのUTF-8文字列を読み込みbuf に格納します。

引数
[out]lenbufに格納されたバイト数
[out]buf文字列を格納するバッファ
[in]nバッファサイズ
[in]delimデリミタ
戻り値
n バイト目までにデリミタが見つかった場合はtrue, そうでなければfalse
説明
delim は読み込まれず、buf はヌル文字で終端されることはありません。 また、必ずUTF-8のコードポイント単位で読み込まれます。

◆ ReadUntil() [2/3]

template<class T>
bool nn::nlib::TextReader::ReadUntil ( size_t *  len,
nlib_utf8_t buf,
size_t  n,
pred 
)
noexcept

最大n バイトのUTF-8文字列を読み込みbuf に格納します。

非推奨:
このメンバ関数は将来のリリースにおいて削除されます。predは文字列へのポインタを取りますが、安全にアクセスできる範囲が明確ではないという問題があります。
テンプレート引数
T判定用関数オブジェクトの型
引数
[out]lenbuf に格納されたバイト数
[out]buf文字列を格納するバッファ
[in]nバッファサイズ
[in]pred関数オブジェクト
戻り値
n バイト目までにデリミタが見つかった場合はtrue, そうでなければfalse
説明
内部で、pred(const char* ptr)を呼び出してデリミタかどうかを判定します。 pred の引数となるptrはUTF-8文字へのポインタで、1コードポイント分のデータにアクセスが可能です。
以下のようなコードを記述して判定を行うことができます。 静的メンバはコードポイントの先頭部分のみで呼び出されます。
struct SearchE38182 {
bool operator()(const char* ptr) {
const unsigned char* p = reinterpret_cast<const unsigned char*>(ptr);
return p[0] == 0xE3 && p[1] == 0x81 && p[2] == 0x82;
}
};
なお、buf はヌル文字で終端されることはありません。 また、必ずUTF-8のコードポイント単位で読み込まれます。

TextReader.h129 行目に定義があります。

◆ ReadUntil() [3/3]

template<class T , size_t N>
nn::nlib::TextReader::ReadUntil ( size_t *  len,
nlib_utf8_t(&)  buf[N],
pred 
)
inlinenoexcept

上記関数のテンプレートオーバーロードです。

非推奨:
このメンバ関数は将来のリリースにおいて削除されます。

TextReader.h68 行目に定義があります。

◆ SetError()

nn::nlib::TextReader::SetError ( errno_t  e) const
inlinenoexcept

エラー値を設定します。

引数
[in]eエラー値
説明
エラーが設定されていない場合はe をエラー値として設定します。

TextReader.h89 行目に定義があります。

◆ SkipWs()

nn::nlib::TextReader::SkipWs ( )
inlinenoexcept

ストリーム内の空白(スペース,改行,タブ,復帰)文字を読み飛ばして、読み飛ばした空白の数を返します。

戻り値
読み飛ばした空白の数

TextReader.h42 行目に定義があります。


このクラス詳解は次のファイルから抽出されました: