第十四个工具类:FileData
用于文本文件读取/保存,以及在内存中修改文本文件内容。
读取:ifstream
保存:ofstream
修改内容:以string类型,获取/设置,文本文件内容
最大支持文件大小1M
上代码:
FileData.h
#ifndef __FileData_h__
#define __FileData_h__
#include <string>
namespace common{
namespace tool{
class FileData
{
public:
FileData();
FileData(const FileData& other);
~FileData();
FileData& operator=(const FileData& other);
// 提取文本文件内容,将文本中内容下标为[begin, end]之间(包括)的字符,提取到data中
void GetData(std::string& data, unsigned int begin, unsigned int end);
// 设置文本文件内容,用data中内容,替换掉文本中内容下标为[begin, end]之间(包括)的字符
void SetData(const std::string& data, unsigned int begin, unsigned int end);
// 获取文本文件内容长度
unsigned int GetLen();
// 设置文本文件内容长度
void SetLen(unsigned int len);
// 读取/保存文本文件
void Load(const std::string& fileName);
void Save(const std::string& fileName);
// 文本数据最大支持1M
static const unsigned int MaxDataLen = 1024 * 1024;
private:
unsigned int m_DataLen;
char m_Data[MaxDataLen];
};
}
}
#endif
FileData.cpp
#include "FileData.h"
#include <string.h>
#include <fstream>
namespace common{
namespace tool{
FileData::FileData()
{
m_DataLen = 0;
}
FileData::FileData(const FileData& other)
{
*this = other;
}
FileData::~FileData()
{
}
FileData& FileData::operator=(const FileData& other)
{
m_DataLen = other.m_DataLen;
memcpy(m_Data, other.m_Data, other.m_DataLen);
return *this;
}
void FileData::GetData(std::string& data, unsigned int begin, unsigned int end)
{
if (begin <= end && end < MaxDataLen)
{
data.assign(m_Data + begin, end - begin + 1);
}
}
void FileData::SetData(const std::string& data, unsigned int begin, unsigned int end)
{
if (begin <= end && end < MaxDataLen && (end - begin + 1) <= data.length())
{
memcpy(m_Data + begin, data.c_str(), end - begin + 1);
if (m_DataLen < end + 1)
{
m_DataLen = end + 1;
}
}
}
unsigned int FileData::GetLen()
{
return m_DataLen;
}
void FileData::SetLen(unsigned int len)
{
m_DataLen = len;
}
void FileData::Load(const std::string& fileName)
{
std::ifstream file;
file.open(fileName.c_str(), std::ios::in | std::ios::binary | std::ios::ate);
if (file)
{
m_DataLen = static_cast<unsigned int>(file.tellg());
if (m_DataLen <= MaxDataLen)
{
file.seekg(0, std::ios::beg);
file.read(m_Data, m_DataLen);
}
file.close();
}
}
void FileData::Save(const std::string& fileName)
{
std::ofstream file;
file.open(fileName.c_str(), std::ios::out | std::ios::trunc | std::ios::binary);
if (file)
{
file.write(m_Data, m_DataLen);
file.flush();
file.close();
}
}
}
}