//+------------------------------------------------------------------+ //| FileBin.mqh | //| Copyright 2000-2025, MetaQuotes Ltd. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #include "File.mqh" //+------------------------------------------------------------------+ //| Class CFileBin | //| Purpose: Class of operations with binary files | //| Derives from class CFile | //+------------------------------------------------------------------+ class CFileBin : public CFile { public: CFileBin(void); ~CFileBin(void); //--- methods for working with files int Open(const string file_name,const int open_flags); //--- methods for writing data uint WriteChar(const char value); uint WriteShort(const short value); uint WriteInteger(const int value); uint WriteLong(const long value); uint WriteFloat(const float value); uint WriteDouble(const double value); uint WriteString(const string value); uint WriteString(const string value,const int size); uint WriteCharArray(const char &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint WriteShortArray(const short& array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint WriteIntegerArray(const int& array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint WriteLongArray(const long &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint WriteFloatArray(const float &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint WriteDoubleArray(const double &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); template uint WriteArray(T &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); template uint WriteStruct(T &data); bool WriteObject(CObject *object); template uint WriteEnum(const T value) { return(WriteInteger((int)value)); } //--- methods for reading data bool ReadChar(char &value); bool ReadShort(short &value); bool ReadInteger(int &value); bool ReadLong(long &value); bool ReadFloat(float &value); bool ReadDouble(double &value); bool ReadString(string &value); bool ReadString(string &value,const int size); uint ReadCharArray(char &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint ReadShortArray(short& array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint ReadIntegerArray(int& array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint ReadLongArray(long &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint ReadFloatArray(float &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); uint ReadDoubleArray(double &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); template uint ReadArray(T &array[],const int start_item=0,const int items_count=WHOLE_ARRAY); template uint ReadStruct(T &data); bool ReadObject(CObject *object); template bool ReadEnum(T &value); }; //+------------------------------------------------------------------+ //| Constructor | //+------------------------------------------------------------------+ CFileBin::CFileBin(void) { } //+------------------------------------------------------------------+ //| Destructor | //+------------------------------------------------------------------+ CFileBin::~CFileBin(void) { } //+------------------------------------------------------------------+ //| Opening a binary file | //+------------------------------------------------------------------+ int CFileBin::Open(const string file_name,const int open_flags) { return(CFile::Open(file_name,open_flags|FILE_BIN)); } //+------------------------------------------------------------------+ //| Write a variable of char or uchar type | //+------------------------------------------------------------------+ uint CFileBin::WriteChar(const char value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteInteger(m_handle,value,sizeof(char))); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of short or ushort type | //+------------------------------------------------------------------+ uint CFileBin::WriteShort(const short value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteInteger(m_handle,value,sizeof(short))); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of int or uint type | //+------------------------------------------------------------------+ uint CFileBin::WriteInteger(const int value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteInteger(m_handle,value,sizeof(int))); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of long or ulong type | //+------------------------------------------------------------------+ uint CFileBin::WriteLong(const long value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteLong(m_handle,value)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of float type | //+------------------------------------------------------------------+ uint CFileBin::WriteFloat(const float value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteFloat(m_handle,value)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of double type | //+------------------------------------------------------------------+ uint CFileBin::WriteDouble(const double value) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteDouble(m_handle,value)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a variable of string type | //+------------------------------------------------------------------+ uint CFileBin::WriteString(const string value) { //--- check handle if(m_handle!=INVALID_HANDLE) { //--- size of string int size=StringLen(value); //--- write if(FileWriteInteger(m_handle,size)==sizeof(int)) return(FileWriteString(m_handle,value,size)); } //--- failure return(0); } //+------------------------------------------------------------------+ //| Write a part of string | //+------------------------------------------------------------------+ uint CFileBin::WriteString(const string value,const int size) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteString(m_handle,value,size)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write array variables of type char or uchar | //+------------------------------------------------------------------+ uint CFileBin::WriteCharArray(const char &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of short or ushort type | //+------------------------------------------------------------------+ uint CFileBin::WriteShortArray(const short &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of int or uint type | //+------------------------------------------------------------------+ uint CFileBin::WriteIntegerArray(const int &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of long or ulong type | //+------------------------------------------------------------------+ uint CFileBin::WriteLongArray(const long &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of float type | //+------------------------------------------------------------------+ uint CFileBin::WriteFloatArray(const float &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of double type | //+------------------------------------------------------------------+ uint CFileBin::WriteDoubleArray(const double &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an array of variables of any type | //+------------------------------------------------------------------+ template uint CFileBin::WriteArray(T &array[],const int start_item=0,const int items_count=WHOLE_ARRAY) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write an structure | //+------------------------------------------------------------------+ template uint CFileBin::WriteStruct(T &data) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileWriteStruct(m_handle,data)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Write data of an instance of the CObject class | //+------------------------------------------------------------------+ bool CFileBin::WriteObject(CObject *object) { //--- check handle & object if(m_handle!=INVALID_HANDLE) if(CheckPointer(object)) return(object.Save(m_handle)); //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of char or uchar type | //+------------------------------------------------------------------+ bool CFileBin::ReadChar(char &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=(char)FileReadInteger(m_handle,sizeof(char)); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of short or ushort type | //+------------------------------------------------------------------+ bool CFileBin::ReadShort(short &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=(short)FileReadInteger(m_handle,sizeof(short)); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of int or uint type | //+------------------------------------------------------------------+ bool CFileBin::ReadInteger(int &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=FileReadInteger(m_handle,sizeof(int)); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of long or ulong type | //+------------------------------------------------------------------+ bool CFileBin::ReadLong(long &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=FileReadLong(m_handle); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of float type | //+------------------------------------------------------------------+ bool CFileBin::ReadFloat(float &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=FileReadFloat(m_handle); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of double type | //+------------------------------------------------------------------+ bool CFileBin::ReadDouble(double &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); value=FileReadDouble(m_handle); return(GetLastError()==0); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of string type | //+------------------------------------------------------------------+ bool CFileBin::ReadString(string &value) { //--- check handle if(m_handle!=INVALID_HANDLE) { ResetLastError(); int size=FileReadInteger(m_handle); if(GetLastError()==0) { value=FileReadString(m_handle,size); return(size==StringLen(value)); } } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a part of string | //+------------------------------------------------------------------+ bool CFileBin::ReadString(string &value,const int size) { //--- check handle if(m_handle!=INVALID_HANDLE) { value=FileReadString(m_handle,size); return(size==StringLen(value)); } //--- failure return(false); } //+------------------------------------------------------------------+ //| Read an array of variables of char or uchar type | //+------------------------------------------------------------------+ uint CFileBin::ReadCharArray(char &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of short or ushort type | //+------------------------------------------------------------------+ uint CFileBin::ReadShortArray(short &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of int or uint type | //+------------------------------------------------------------------+ uint CFileBin::ReadIntegerArray(int &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of long or ulong type | //+------------------------------------------------------------------+ uint CFileBin::ReadLongArray(long &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of float type | //+------------------------------------------------------------------+ uint CFileBin::ReadFloatArray(float &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of double type | //+------------------------------------------------------------------+ uint CFileBin::ReadDoubleArray(double &array[],const int start_item,const int items_count) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an array of variables of any type | //+------------------------------------------------------------------+ template uint CFileBin::ReadArray(T &array[],const int start_item=0,const int items_count=WHOLE_ARRAY) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadArray(m_handle,array,start_item,items_count)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read an structure | //+------------------------------------------------------------------+ template uint CFileBin::ReadStruct(T &data) { //--- check handle if(m_handle!=INVALID_HANDLE) return(FileReadStruct(m_handle,data)); //--- failure return(0); } //+------------------------------------------------------------------+ //| Read data of an instance of the CObject class | //+------------------------------------------------------------------+ bool CFileBin::ReadObject(CObject *object) { //--- check handle & object if(m_handle!=INVALID_HANDLE) if(CheckPointer(object)) return(object.Load(m_handle)); //--- failure return(false); } //+------------------------------------------------------------------+ //| Read a variable of an enumeration type | //+------------------------------------------------------------------+ template bool CFileBin::ReadEnum(T &value) { int val; if(!ReadInteger(val)) return(false); //--- value=(T)val; return(true); } //+------------------------------------------------------------------+