nlib
nn::nlib::TextReader クラス

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

#include "nn/nlib/TextReader.h"

公開メンバ関数

errno_t Init () noexcept
 テキストリーダーを初期化します。 [詳解]
 
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, char *buf, size_t n, char delim) noexcept
 delim まで最大n バイトのUTF-8文字列を読み込みbuf に格納します。 [詳解]
 
template<size_t N>
bool ReadUntil (size_t *len, char(&buf)[N], char delim) noexcept
 ReadUntil(len, buf, N, delim) を呼び出します。
 
template<class T >
bool ReadUntil (size_t *len, char *buf, size_t n, T pred) noexcept
 最大n バイトのUTF-8文字列を読み込みbuf に格納します。 [詳解]
 
template<class T , size_t N>
bool ReadUntil (size_t *len, char(&buf)[N], T pred) noexcept
 ReadUntil(len, buf, N, pred) を呼び出します。
 
size_t ReadDecimalString (char *buf, size_t n) noexcept
 0-9までの文字を最大n 文字まで読み込みbuf に格納します。 [詳解]
 
template<size_t N>
size_t ReadDecimalString (char(&buf)[N]) noexcept
 ReadDecimalString(buf, N) を呼び出します。
 
bool Proceed (const char *str, size_t n) noexcept
 文字列str の分だけストリームを進めます。 [詳解]
 
bool Proceed (char c) noexcept
 文字c の分だけストリームを進めます。 [詳解]
 
bool ProceedEx (const char *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を返します。
 
基本的なメンバ関数
 TextReader () noexcept
 デフォルトコンストラクタです。
 
virtual ~TextReader () noexcept
 デストラクタです。ストリームはクローズされません。
 

詳解

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

説明
ストリームからUTF-8の文字列を読みだして、UTF-32かUTF-16で1文字ずつ取得することができます。
改行文字列については以下のように加工されます。
  • CRLFLFとして渡されます。
  • CRLFとして渡されます。
  • LFLFとして渡されます。
また、冗長なUTF-8を検出した場合は、エラー(EILSEQ)になります。 U+D800-U+DFFFに対応するUTF-8を検出した場合もエラー(EILSEQ)になります。
const char str[] = "multibyte \r\nstring";
MemoryInputStream istr;
istr.Init(str);
if (nlib_is_error(r.Init(&istr))) { ERROR; }
int c;
while ((c = r.Read()) != -1) {
// cはUTF-32の値になって、Unicodeのコードポイント単位で処理できる。
// 1文字ずつ処理するのではなく、単に変換したい場合は、unicode::Utf8ToUtf16() 等を利用するほうがよい。
// 順番に、L"multibyte \nstring"が1文字ずつ読まれる。
// 改行は正規化される。
}
if (nlib_is_error(r)) { ERROR; }
if (nlib_is_error(r.Close())) { ERROR; }
TextReaderを継承し、FillBuffer_()メンバ関数をオーバーライドすることによって、UTF-8テキストのチェックを追加することができます。 TextReaderクラスではUTF-8が有効かどうかと改行コードの処理を行っています。
派生クラスでの実装の概略を以下に示します。
virtual void DerivedClass::FillBuffer() NLIB_NOEXCEPT {
TextReader::FillBuffer_();
// GetCur()からGetBufEnd()までに文字列がバッファされている。
// これらをチェックして加工し、エラーを発生させたりすることができる。
// 文字数が減る場合は、SetBufEnd()メンバ関数で設定が必要。
// 文字数を増やすことはできない。
}
各種例:
misc/readfile/readfile.cpp, misc/writefile/writefile.cpp.

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

関数詳解

§ Close()

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

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

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

§ GetColumn()

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

現在の桁を取得します。

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

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

§ GetErrorValue()

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

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

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

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

§ GetLine()

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

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

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

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

§ GetStream()

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

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

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

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

§ Init()

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

テキストリーダーを初期化します。

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

§ Open()

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

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

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

§ Peek()

nn::nlib::TextReader::Peek ( )
inlinenoexcept

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

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

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

§ Proceed() [1/2]

nn::nlib::TextReader::Proceed ( const char *  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.h90 行目に定義があります。

§ ProceedEx()

nn::nlib::TextReader::ProceedEx ( const char *  str)
noexcept

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

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

§ Read()

nn::nlib::TextReader::Read ( )
inlinenoexcept

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

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

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

§ ReadDecimalString()

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

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

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

§ ReadUntil() [1/2]

nn::nlib::TextReader::ReadUntil ( size_t *  len,
char *  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/2]

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

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

テンプレート引数
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.h143 行目に定義があります。

§ SetError()

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

エラー値を設定します。

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

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

§ SkipWs()

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

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

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

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


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