code update
This commit is contained in:
12
README.md
12
README.md
@@ -15,3 +15,15 @@ c/c++基本开发库
|
|||||||
可以计算特定符号最后一个字节所在位置
|
可以计算特定符号最后一个字节所在位置
|
||||||
|
|
||||||
所有操作都添加mutex锁机制 ,保障线程安全
|
所有操作都添加mutex锁机制 ,保障线程安全
|
||||||
|
|
||||||
|
|
||||||
|
# 读文件操作
|
||||||
|
支持全文读取(文本和二进制模式)
|
||||||
|
支持按行读取文本内容
|
||||||
|
支持按指定字节数读取数据
|
||||||
|
支持计算第一个指定字节序列结束位置(包含该序列本身)的字节数
|
||||||
|
提供文件是否存在和文件大小查询
|
||||||
|
支持重置文件读取位置,实现多次读取
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@@ -198,6 +198,7 @@ namespace QCL
|
|||||||
* - 与 WriteFile 类风格保持一致
|
* - 与 WriteFile 类风格保持一致
|
||||||
* - 支持文本文件与二进制文件
|
* - 支持文本文件与二进制文件
|
||||||
* - 自动关闭文件(析构时)
|
* - 自动关闭文件(析构时)
|
||||||
|
* - 内部使用 std::mutex 实现线程安全
|
||||||
*/
|
*/
|
||||||
class ReadFile
|
class ReadFile
|
||||||
{
|
{
|
||||||
@@ -278,8 +279,9 @@ namespace QCL
|
|||||||
void Reset();
|
void Reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::string filename_; // 文件路径
|
std::string filename_; // 文件路径
|
||||||
std::ifstream file_; // 文件流对象
|
std::ifstream file_; // 文件流对象
|
||||||
|
mutable std::mutex mtx_; // 可变,保证 const 方法也能加锁
|
||||||
};
|
};
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
@@ -344,11 +344,15 @@ namespace QCL
|
|||||||
|
|
||||||
ReadFile::~ReadFile()
|
ReadFile::~ReadFile()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
Close();
|
Close();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadFile::Open()
|
bool ReadFile::Open()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
|
if (file_.is_open())
|
||||||
|
file_.close();
|
||||||
file_.open(filename_, std::ios::in | std::ios::binary);
|
file_.open(filename_, std::ios::in | std::ios::binary);
|
||||||
return file_.is_open();
|
return file_.is_open();
|
||||||
}
|
}
|
||||||
@@ -356,16 +360,21 @@ namespace QCL
|
|||||||
void ReadFile::Close()
|
void ReadFile::Close()
|
||||||
{
|
{
|
||||||
if (file_.is_open())
|
if (file_.is_open())
|
||||||
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
file_.close();
|
file_.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadFile::IsOpen() const
|
bool ReadFile::IsOpen() const
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
return file_.is_open();
|
return file_.is_open();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string ReadFile::ReadAllText()
|
std::string ReadFile::ReadAllText()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!file_.is_open() && !Open())
|
if (!file_.is_open() && !Open())
|
||||||
return "";
|
return "";
|
||||||
|
|
||||||
@@ -376,6 +385,7 @@ namespace QCL
|
|||||||
|
|
||||||
std::vector<char> ReadFile::ReadAllBinary()
|
std::vector<char> ReadFile::ReadAllBinary()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!file_.is_open() && !Open())
|
if (!file_.is_open() && !Open())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
@@ -384,6 +394,7 @@ namespace QCL
|
|||||||
|
|
||||||
std::vector<std::string> ReadFile::ReadLines()
|
std::vector<std::string> ReadFile::ReadLines()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!file_.is_open() && !Open())
|
if (!file_.is_open() && !Open())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
@@ -398,17 +409,19 @@ namespace QCL
|
|||||||
|
|
||||||
std::vector<char> ReadFile::ReadBytes(size_t count)
|
std::vector<char> ReadFile::ReadBytes(size_t count)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!file_.is_open() && !Open())
|
if (!file_.is_open() && !Open())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
std::vector<char> buffer(count);
|
std::vector<char> buffer(count);
|
||||||
file_.read(buffer.data(), count);
|
file_.read(buffer.data(), count);
|
||||||
buffer.resize(file_.gcount()); // 实际读取的字节数
|
buffer.resize(file_.gcount());
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ReadFile::GetBytesBefore(const std::string &marker)
|
size_t ReadFile::GetBytesBefore(const std::string &marker)
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!file_.is_open() && !Open())
|
if (!file_.is_open() && !Open())
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@@ -425,11 +438,13 @@ namespace QCL
|
|||||||
|
|
||||||
bool ReadFile::FileExists() const
|
bool ReadFile::FileExists() const
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
return std::filesystem::exists(filename_);
|
return std::filesystem::exists(filename_);
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t ReadFile::GetFileSize() const
|
size_t ReadFile::GetFileSize() const
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (!FileExists())
|
if (!FileExists())
|
||||||
return 0;
|
return 0;
|
||||||
return std::filesystem::file_size(filename_);
|
return std::filesystem::file_size(filename_);
|
||||||
@@ -437,9 +452,10 @@ namespace QCL
|
|||||||
|
|
||||||
void ReadFile::Reset()
|
void ReadFile::Reset()
|
||||||
{
|
{
|
||||||
|
std::lock_guard<std::mutex> lock(mtx_);
|
||||||
if (file_.is_open())
|
if (file_.is_open())
|
||||||
{
|
{
|
||||||
file_.clear(); // 清除 EOF 标志
|
file_.clear();
|
||||||
file_.seekg(0, std::ios::beg);
|
file_.seekg(0, std::ios::beg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user