mFrame
載入中...
搜尋中...
無符合項目
ufm::util::LineReader 類別 參考文件

行資料讀取器,提供從緩衝區解析多種資料類型的功能。 更多...

#include <LineReader.h>

類別ufm::util::LineReader的繼承圖:
ufm::lang::Object ufm::lang::NonCopyable ufm::lang::Iterable< const char > ufm::lang::Interface ufm::util::Scanner

公開方法(Public Methods)

 LineReader (ufm::lang::Memory buffer) noexcept
 使用現有緩衝區構造 LineReader 物件
 
 LineReader (LineReader &&other) noexcept
 移動建構子
 
virtual ~LineReader (void) override
 解構子,釋放資源
 
virtual void forEach (ufm::func::Consumer< const char & > &action) override
 遍歷集合中所有元素,對每個元素執行指定操作。 若所有元素處理完畢或操作中發生異常則停止。
 
virtual const char * elementAt (int index) const override
 獲取集合中指定索引處的元素。
 
virtual int nextIndex (int index) const override
 返回當前索引的下一個有效索引。
 
virtual ufm::util::Iterator< const char > begin (void) override
 取得目前插入位置。
 
virtual ufm::util::Iterator< const char > end (void) override
 取得 Scanner 結尾迭代器。
 
int nextTokenLength (int limit=0)
 取得下一個 token 的長度。
 
bool hasNextToken (int limit=0)
 判斷緩衝區是否有下一個 token。
 
bool hasNext (void) const
 判斷緩衝區是否有下一個字元。
 
bool hasNextChar (char ch)
 判斷緩衝區是否有指定字元。
 
bool hasNextBoolean (void)
 判斷緩衝區是否有可解析的布林值(true/false)。
 
bool hasNextInteger (int limit=0)
 判斷緩衝區是否有可解析的整數。
 
bool hasNextFloat (int limit=0)
 判斷緩衝區是否有可解析的浮點數。
 
int hasNextLine (int limit=0)
 判斷緩衝區是否有完整的一行(遇到換行符)。
 
bool nextBoolean (bool &result)
 讀取下一個布林值(true/false),並移除。
 
int nextLine (ufm::lang::Appendable &appendable, int limit=0)
 讀取下一行字串,並寫入指定 appendable。
 
int nextLine (void *pointer, int length)
 讀取下一行字串,寫入指定記憶體區。
 
bool nextInteger (int &result, int limit=0)
 讀取下一個整數,並移除。
 
bool nextFloat (float &result, int limit=0)
 讀取下一個浮點數,並移除。
 
bool nextChar (char &result)
 讀取下一個字元,並移除。
 
int next (ufm::lang::Appendable &appendable, int limit=0)
 讀取下一個字串,並寫入指定 appendable。
 
int skip (char pattern, int limit=0)
 跳過直到遇到指定字元或達到限制。
 
int skipAll (void)
 跳過指定長度的字元。
 
int skipNextToken (int limit=0)
 跳過當前字串直到分隔符。
 
int skipNextLine (int limit=0)
 跳過當前行直到下一行(遇到換行符)。
 
int avariable (void) const
 取得緩衝區可讀取的位元組數。
 
- 公開方法(Public Methods) 繼承自 ufm::lang::Object
void * operator new (size_t n)
 使用運算子 new 分配記憶體
 
void * operator new (size_t n, void *p)
 在指定記憶體上調用運算子 new
 
virtual ufm::lang::ObjectgetObject (void) override
 取得對應的 Object 物件
 
void delay (int milliseconds) const
 延遲指定的毫秒數進行執行緒等待
 
bool equals (Object *object) const
 判斷與另一物件是否為相同參照(指標型態比較)
 
bool equals (Object &object) const
 判斷與另一物件是否為相同參照(參照型態比較)
 
void wait (void) const
 使當前線程等待直到被通知
 
bool wait (int timeout) const
 等待通知或超時
 
bool yield (void) const
 讓執行緒讓渡控制權給同優先權的下一個執行緒
 
int lock (void) const
 核心鎖定,鎖定期間禁止線程切換
 
int unlock (void) const
 核心解鎖
 
ufm::sys::ThreadcurrentThread (void) const
 取得當前執行緒指標
 
virtual int hashcode (void) const
 返回對象的哈希碼值。支持這種方法是為了散列表,如HashMap提供的那樣。
 
- 公開方法(Public Methods) 繼承自 ufm::lang::Interface
virtual ~Interface (void)=default
 虛擬析構函式
 
- 公開方法(Public Methods) 繼承自 ufm::lang::NonCopyable
 NonCopyable (void)=default
 建構一個新的 NonCopyable 物件
 
 NonCopyable (const NonCopyable &other)=delete
 禁止複製建構子
 
NonCopyableoperator= (const NonCopyable &other)=delete
 禁止複製賦值運算子
 

保護屬性

ufm::lang::Memory vBuffer
 用於存儲資料的記憶體緩衝區
 
int vHead
 當前讀取位置索引
 
int vTail
 緩衝區尾部索引
 

詳細描述

行資料讀取器,提供從緩衝區解析多種資料類型的功能。

LineReader 是一個功能強大的資料解析器,專門用於從緩衝區中 逐行或逐欄位解析各種類型的資料,包括字串、整數、浮點數、布林值等。 它提供了豐富的資料檢測和讀取方法,適用於處理各種格式的文字資料流。

主要功能:
  • 支援多種資料類型的解析(字串、整數、浮點數、布林值)
  • 提供資料存在性檢查功能(hasNextXxx 系列方法)
  • 支援資料讀取和跳過功能(nextXxx 和 skipXxx 系列方法)
  • 可使用外部緩衝區或自動分配緩衝區
  • 支援迭代器模式遍歷字元
使用場景:
  • 解析 UART 串口資料
  • 處理 CSV 或其他分隔符格式的檔案
  • 解析網路通訊協定資料
  • 命令列參數解析
  • 設定檔案解析
資料格式支援:
  • 字串:以空白字元或分隔符分隔的文字
  • 整數:支援正負數,十進制格式
  • 浮點數:支援小數點格式
  • 布林值:true/false 字串形式
  • 行資料:以換行符結尾的完整行
使用範例:
// 基本字串解析範例
const char* testData = "Hello 123 45.67 true World\nSecond Line\n";
ufm::lang::Memory buffer(const_cast<char*>(testData), strlen(testData));
ufm::util::LineReader reader(buffer);
std::cout << "=== 基本資料解析 ===" << std::endl;
// 解析字串
if (reader.hasNextToken()) {
ufm::io::SimpleWriter writer(256);
int len = reader.next(writer);
if (len > 0) {
std::cout << "字串: " << std::string(writer.pointer(), len) << std::endl;
}
}
// 解析整數
if (reader.hasNextInteger()) {
int value;
if (reader.nextInteger(value)) {
std::cout << "整數: " << value << std::endl;
}
}
// 解析浮點數
if (reader.hasNextFloat()) {
float value;
if (reader.nextFloat(value)) {
std::cout << "浮點數: " << value << std::endl;
}
}
// 解析布林值
if (reader.hasNextBoolean()) {
bool value;
if (reader.nextBoolean(value)) {
std::cout << "布林值: " << (value ? "true" : "false") << std::endl;
}
}
// 跳過一些字元到下一個感興趣的部分
reader.skip(' '); // 跳過空格
// 解析剩餘字串
if (reader.hasNextToken()) {
ufm::io::SimpleWriter writer(256);
int len = reader.next(writer);
if (len > 0) {
std::cout << "剩餘字串: " << std::string(writer.pointer(), len) << std::endl;
}
}
// CSV 資料解析範例
class CSVParser {
private:
public:
CSVParser(const char* csvData)
: reader(ufm::lang::Memory(const_cast<char*>(csvData), strlen(csvData))) {}
void parseCSV() {
std::cout << "\n=== CSV 解析範例 ===" << std::endl;
int lineNumber = 1;
while (reader.hasNextLine() > 0) {
std::cout << "第 " << lineNumber << " 行: ";
// 讀取整行資料
ufm::io::SimpleWriter lineWriter(256);
int lineLength = reader.nextLine(lineWriter);
if (lineLength > 0) {
std::string line(lineWriter.pointer(), lineLength);
std::cout << line << std::endl;
// 進一步解析行中的欄位(這裡簡化為按空格分割)
parseFields(line);
}
lineNumber++;
}
}
private:
void parseFields(const std::string& line) {
ufm::util::LineReader fieldReader(
ufm::lang::Memory(const_cast<char*>(line.c_str()), line.length())
);
int fieldIndex = 1;
while (fieldReader.hasNextToken()) {
ufm::io::SimpleWriter fieldWriter(64);
int fieldLength = fieldReader.next(fieldWriter);
if (fieldLength > 0) {
std::string field(fieldWriter.pointer(), fieldLength);
std::cout << " 欄位 " << fieldIndex << ": " << field << std::endl;
}
fieldIndex++;
}
}
};
// 使用 CSV 解析器
const char* csvData = "Name Age Salary\nJohn 25 50000\nJane 30 60000\n";
CSVParser csvParser(csvData);
csvParser.parseCSV();
// 命令解析範例
class CommandParser {
private:
public:
CommandParser() : reader(512) {} // 使用 512 bytes 緩衝區
void processCommand(const char* command) {
std::cout << "\n=== 命令解析範例 ===" << std::endl;
std::cout << "處理命令: " << command << std::endl;
// 重新初始化 reader 用新的命令資料
ufm::lang::Memory cmdBuffer(const_cast<char*>(command), strlen(command));
reader = ufm::util::LineReader(cmdBuffer);
// 解析命令名稱
if (reader.hasNextToken()) {
ufm::io::SimpleWriter cmdWriter(64);
int cmdLength = reader.next(cmdWriter);
if (cmdLength > 0) {
std::string cmdName(cmdWriter.pointer(), cmdLength);
std::cout << "命令名稱: " << cmdName << std::endl;
// 根據命令名稱解析參數
if (cmdName == "set") {
parseSetCommand();
} else if (cmdName == "get") {
parseGetCommand();
} else if (cmdName == "calc") {
parseCalcCommand();
} else {
std::cout << "未知命令: " << cmdName << std::endl;
}
}
}
}
private:
void parseSetCommand() {
std::cout << "解析 SET 命令參數:" << std::endl;
// 期待: set variable_name value
if (reader.hasNextToken()) {
ufm::io::SimpleWriter varWriter(64);
int varLength = reader.next(varWriter);
if (varLength > 0) {
std::string varName(varWriter.pointer(), varLength);
std::cout << " 變數名稱: " << varName << std::endl;
}
}
if (reader.hasNextToken()) {
ufm::io::SimpleWriter valueWriter(64);
int valueLength = reader.next(valueWriter);
if (valueLength > 0) {
std::string value(valueWriter.pointer(), valueLength);
std::cout << " 數值: " << value << std::endl;
}
}
}
void parseGetCommand() {
std::cout << "解析 GET 命令參數:" << std::endl;
if (reader.hasNextToken()) {
ufm::io::SimpleWriter varWriter(64);
int varLength = reader.next(varWriter);
if (varLength > 0) {
std::string varName(varWriter.pointer(), varLength);
std::cout << " 要獲取的變數: " << varName << std::endl;
}
}
}
void parseCalcCommand() {
std::cout << "解析 CALC 命令參數:" << std::endl;
// 期待: calc num1 operator num2
if (reader.hasNextInteger()) {
int num1;
if (reader.nextInteger(num1)) {
std::cout << " 數字1: " << num1 << std::endl;
}
}
if (reader.hasNextToken()) {
ufm::io::SimpleWriter opWriter(8);
int opLength = reader.next(opWriter);
if (opLength > 0) {
std::string op(opWriter.pointer(), opLength);
std::cout << " 運算子: " << op << std::endl;
}
}
if (reader.hasNextInteger()) {
int num2;
if (reader.nextInteger(num2)) {
std::cout << " 數字2: " << num2 << std::endl;
}
}
}
};
// 使用命令解析器
CommandParser cmdParser;
cmdParser.processCommand("set temperature 25");
cmdParser.processCommand("get humidity");
cmdParser.processCommand("calc 10 + 5");
// 資料驗證範例
class DataValidator {
public:
static bool validateNumberSequence(const char* data) {
ufm::lang::Memory(const_cast<char*>(data), strlen(data))
);
std::cout << "\n=== 資料驗證範例 ===" << std::endl;
std::cout << "驗證數字序列: " << data << std::endl;
int numberCount = 0;
bool allValid = true;
while (reader.avariable() > 0) {
if (reader.hasNextInteger()) {
int value;
if (reader.nextInteger(value)) {
std::cout << " 有效數字 " << (numberCount + 1)
<< ": " << value << std::endl;
numberCount++;
}
} else {
// 跳過非數字字元
char ch;
if (reader.nextChar(ch)) {
if (!isspace(ch)) {
std::cout << " 跳過無效字元: '" << ch << "'" << std::endl;
allValid = false;
}
} else {
break;
}
}
}
std::cout << "總計找到 " << numberCount << " 個有效數字" << std::endl;
std::cout << "資料完全有效: " << (allValid ? "是" : "否") << std::endl;
return allValid && numberCount > 0;
}
};
// 測試資料驗證
DataValidator::validateNumberSequence("123 456 789");
DataValidator::validateNumberSequence("123 abc 456");
提供資料寫入功能的簡易實現類
Definition SimpleWriter.h:43
動態記憶體管理類別
Definition Memory.h:38
行資料讀取器,提供從緩衝區解析多種資料類型的功能。
Definition LineReader.h:343
bool hasNextToken(int limit=0)
判斷緩衝區是否有下一個 token。
Definition LineReader.h:462
int avariable(void) const
取得緩衝區可讀取的位元組數。
Definition LineReader.h:601
bool nextChar(char &result)
讀取下一個字元,並移除。
int hasNextLine(int limit=0)
判斷緩衝區是否有完整的一行(遇到換行符)。
bool hasNextInteger(int limit=0)
判斷緩衝區是否有可解析的整數。
int nextLine(ufm::lang::Appendable &appendable, int limit=0)
讀取下一行字串,並寫入指定 appendable。
int next(ufm::lang::Appendable &appendable, int limit=0)
讀取下一個字串,並寫入指定 appendable。
bool nextInteger(int &result, int limit=0)
讀取下一個整數,並移除。
參閱
ufm::lang::Object
ufm::lang::NonCopyable
ufm::lang::Iterable
ufm::util::Iterator
ufm::io::ByteBuffer
1.0.0

建構子與解構子說明文件

◆ LineReader() [1/2]

ufm::util::LineReader::LineReader ( ufm::lang::Memory buffer)
noexcept

使用現有緩衝區構造 LineReader 物件

參數
buffer指定要讀取的緩衝區

◆ LineReader() [2/2]

ufm::util::LineReader::LineReader ( LineReader && other)
inlinenoexcept

移動建構子

參數
other來源 LineReader 物件

函式成員說明文件

◆ avariable()

int ufm::util::LineReader::avariable ( void ) const
inline

取得緩衝區可讀取的位元組數。

傳回值
int 可讀取的位元組數

◆ begin()

virtual ufm::util::Iterator< const char > ufm::util::LineReader::begin ( void )
overridevirtual

取得目前插入位置。

此方法回傳下次插入資料的索引位置。

傳回值
int 目前插入位置

實作 ufm::lang::Iterable< const char >.

◆ elementAt()

virtual const char * ufm::util::LineReader::elementAt ( int index) const
overridevirtual

獲取集合中指定索引處的元素。

參數
index要獲取的元素索引
傳回值
E* 指向集合中指定索引處元素的指針

實作 ufm::lang::Iterable< const char >.

◆ end()

virtual ufm::util::Iterator< const char > ufm::util::LineReader::end ( void )
overridevirtual

取得 Scanner 結尾迭代器。

此方法回傳一個代表 Scanner 緩衝區結尾的迭代器, 可用於遍歷至資料結束。

傳回值
Scanner::Iterator 指向結尾的迭代器

實作 ufm::lang::Iterable< const char >.

◆ forEach()

virtual void ufm::util::LineReader::forEach ( ufm::func::Consumer< const char & > & action)
overridevirtual

遍歷集合中所有元素,對每個元素執行指定操作。 若所有元素處理完畢或操作中發生異常則停止。

當操作導致底層資料源發生變動時(未同步處理),其行為未定義。

參數
action對每個元素執行的操作

實作 ufm::lang::Iterable< const char >.

◆ hasNext()

bool ufm::util::LineReader::hasNext ( void ) const

判斷緩衝區是否有下一個字元。

此函式會檢查緩衝區是否有可讀的字元。

傳回值
bool true: 有下一個字元, false: 無

◆ hasNextBoolean()

bool ufm::util::LineReader::hasNextBoolean ( void )

判斷緩衝區是否有可解析的布林值(true/false)。

傳回值
bool true: 有布林值, false: 無

◆ hasNextChar()

bool ufm::util::LineReader::hasNextChar ( char ch)

判斷緩衝區是否有指定字元。

參數
ch指定要查找的字元
傳回值
bool true: 有指定字元, false: 無

◆ hasNextFloat()

bool ufm::util::LineReader::hasNextFloat ( int limit = 0)

判斷緩衝區是否有可解析的浮點數。

參數
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
bool true: 有浮點數, false: 無

◆ hasNextInteger()

bool ufm::util::LineReader::hasNextInteger ( int limit = 0)

判斷緩衝區是否有可解析的整數。

參數
limit搜尋最大長度上限,<=0 自動, >0 指定長度
傳回值
bool true: 有整數, false: 無

◆ hasNextLine()

int ufm::util::LineReader::hasNextLine ( int limit = 0)

判斷緩衝區是否有完整的一行(遇到換行符)。

參數
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
int >=0: 一行字串長度, -1: 不滿足一行

◆ hasNextToken()

bool ufm::util::LineReader::hasNextToken ( int limit = 0)
inline

判斷緩衝區是否有下一個 token。

此函式會搜尋下一個分割符號,最多搜尋 limit 個字元。 若未找到分割符號則回傳 false,否則回傳 true。

參數
limit最多搜尋的字元數,0 表示不限制。
傳回值
bool true: 有下一個 token, false: 無

◆ next()

int ufm::util::LineReader::next ( ufm::lang::Appendable & appendable,
int limit = 0 )

讀取下一個字串,並寫入指定 appendable。

參數
appendable寫入目標
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
int >0: 寫入成功, <=0: 失敗(空間不足或緩衝區不滿足字串條件)

◆ nextBoolean()

bool ufm::util::LineReader::nextBoolean ( bool & result)

讀取下一個布林值(true/false),並移除。

參數
result讀取結果
傳回值
bool true: 取出成功, false: 失敗(緩衝區為空或格式錯誤)

◆ nextChar()

bool ufm::util::LineReader::nextChar ( char & result)

讀取下一個字元,並移除。

參數
result讀取結果
傳回值
bool true: 取出成功, false: 失敗(緩衝區為空)

◆ nextFloat()

bool ufm::util::LineReader::nextFloat ( float & result,
int limit = 0 )

讀取下一個浮點數,並移除。

參數
result讀取結果
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
bool true: 取出成功, false: 失敗(緩衝區為空或格式錯誤)

◆ nextIndex()

virtual int ufm::util::LineReader::nextIndex ( int index) const
overridevirtual

返回當前索引的下一個有效索引。

參數
index當前索引
傳回值
int 下一個有效索引

如果當前索引已經是最後一個元素,則返回 -1。 如果當前索引無效(如 -1),則返回 0

實作 ufm::lang::Iterable< const char >.

◆ nextInteger()

bool ufm::util::LineReader::nextInteger ( int & result,
int limit = 0 )

讀取下一個整數,並移除。

參數
result讀取結果
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
bool true: 取出成功, false: 失敗(緩衝區為空或格式錯誤)

◆ nextLine() [1/2]

int ufm::util::LineReader::nextLine ( ufm::lang::Appendable & appendable,
int limit = 0 )

讀取下一行字串,並寫入指定 appendable。

參數
appendable寫入目標
limit查找最大長度上限,<=0 自動, >0 指定長度
傳回值
int >0: 寫入字元數, -1: 緩衝區不滿足一行

◆ nextLine() [2/2]

int ufm::util::LineReader::nextLine ( void * pointer,
int length )
inline

讀取下一行字串,寫入指定記憶體區。

參數
pointer目標記憶體指標
length可寫入長度
傳回值
int >0: 寫入字元數, <=0: 失敗(緩衝區不滿足一行)

◆ nextTokenLength()

int ufm::util::LineReader::nextTokenLength ( int limit = 0)

取得下一個 token 的長度。

此函式會搜尋下一個分割符號,最多搜尋 limit 個字元。 若未找到分割符號則回傳 -1,否則回傳下個 token 的長度。

參數
limit最多搜尋的字元數,0 表示不限制。
傳回值
int 下個 token 的長度,若未找到分割符號則回傳 -1。

◆ skip()

int ufm::util::LineReader::skip ( char pattern,
int limit = 0 )

跳過直到遇到指定字元或達到限制。

參數
pattern指定字元,0x00 表示直接跳過 limit 數量
limit最大搜尋長度,>0 指定, <=0 不指定
傳回值
int >0: 跳過字元數, <=0: 未找到 pattern

◆ skipAll()

int ufm::util::LineReader::skipAll ( void )
inline

跳過指定長度的字元。

參數
length跳過的字元數,0 表示跳過所有可讀字元
傳回值
int >=0: 跳過字元數, <0: 不滿足條件

◆ skipNextLine()

int ufm::util::LineReader::skipNextLine ( int limit = 0)

跳過當前行直到下一行(遇到換行符)。

參數
limit最大搜尋長度,>0 指定, <=0 不指定
傳回值
int >0: 跳過字元數, -1: 不滿足一行

◆ skipNextToken()

int ufm::util::LineReader::skipNextToken ( int limit = 0)

跳過當前字串直到分隔符。

參數
limit最大搜尋長度,>0 指定, <=0 不指定
傳回值
int >=0: 跳過字元數, <0: 不滿足字串條件

此類別(class) 文件是由下列檔案中產生: