nlib
nn::nlib::TextReader クラス

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

#include "nn/nlib/TextReader.h"

公開メンバ関数

bool Init (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 の分だけストリームを進めます。文字列の長さ制限はありませんが、一致しない場合もストリームの位置が変更される可能性があります。 [詳解]
 
int ReadAsUtf8 (char *b0, char *b1, char *b2, char *b3) noexcept
 ストリームから1コードポイントを読み込み、b0, b1, b2, b3 にUTF-8で格納します。 [詳解]
 
int ReadAsUtf16 (nlib_utf16_t *upper, nlib_utf16_t *lower) noexcept
 ストリームから1コードポイントを読み込み、upper, lower にUTF-16で格納します。 [詳解]
 
int PeekAsUtf16 (nlib_utf16_t *upper, nlib_utf16_t *lower) noexcept
 ストリームの先頭1コードポイントを、upper, lower にUTF-16で格納します。 [詳解]
 
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 (!r.Init(&istr)) { ERROR; }
int c;
while ((c = r.Read()) != -1) {
// cはUTF-32の値になって、Unicodeのコードポイント単位で処理できる。
// 1文字ずつ処理するのではなく、単に変換したい場合は、unicode::Utf8ToUtf16() 等を利用するほうがよい。
// 順番に、L"multibyte \nstring"が1文字ずつ読まれる。
// 改行は正規化される。
}
if (!r) { ERROR; }
if (!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 行目に定義があります。

関数詳解

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

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

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

現在の桁を取得します。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ストリームを与えてテキストリーダーを初期化します。

引数
[in]streamストリーム
戻り値
成功した場合はtrue
説明
既に初期化が行われている場合やstreamNULLの場合はfalseを返します。 BOM付きUTF-8の場合はBOMの部分を読み取ろうとします。 BOMの読取に失敗した場合もfalseを返します。
nn::nlib::TextReader::Peek ( )
inlinenoexcept

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

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

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

nn::nlib::TextReader::PeekAsUtf16 ( nlib_utf16_t upper,
nlib_utf16_t lower 
)
inlinenoexcept

ストリームの先頭1コードポイントを、upper, lower にUTF-16で格納します。

引数
[out]upperUTF-16の文字、又は上位サロゲートが格納されます。
[out]lowerサロゲートペアの場合に下位サロゲートが格納されます。
戻り値
1upper のみに格納されています。
2サロゲートペアがupperlower に格納されています。
0ストリームの終端に達した場合やエラーの場合です。

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

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 がそうでない場合の動作は不定です。
nn::nlib::TextReader::Proceed ( char  c)
inlinenoexcept

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

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

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

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

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

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

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

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

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

nn::nlib::TextReader::ReadAsUtf16 ( nlib_utf16_t upper,
nlib_utf16_t lower 
)
inlinenoexcept

ストリームから1コードポイントを読み込み、upper, lower にUTF-16で格納します。

引数
[out]upperUTF-16の文字、又は上位サロゲートが格納されます。
[out]lowerサロゲートペアの場合に下位サロゲートが格納されます。
戻り値
1upper のみに格納されています。
2サロゲートペアがupperlower に格納されています。
0ストリームの終端に達した場合やエラーの場合です。

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

nn::nlib::TextReader::ReadAsUtf8 ( char *  b0,
char *  b1,
char *  b2,
char *  b3 
)
inlinenoexcept

ストリームから1コードポイントを読み込み、b0, b1, b2, b3 にUTF-8で格納します。

引数
[out]b0UTF-8文字の1バイト目が格納されます。
[out]b1UTF-8文字の2バイト目が格納されます。
[out]b2UTF-8文字の3バイト目が格納されます。
[out]b3UTF-8文字の4バイト目が格納されます。
戻り値
1b0 のみに格納されています。
2b0, b1 に格納されています。
3b0, b1, b2 に格納されています。
4b0, b1, b2, b3 に格納されています。
0ストリームの終端に達した場合やエラーの場合です。

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

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

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

引数
[out]buf文字列が格納されるバッファ
[in]nバッファサイズ
戻り値
読み込んだ文字数
説明
buf はヌル文字で終端されることはありません。
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のコードポイント単位で読み込まれます。
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.h187 行目に定義があります。

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

エラー値を設定します。

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

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

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

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

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

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


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