MQL5Book/Scripts/p4/FileArray.mq5
super.admin 1c8e83ce31 convert
2025-05-30 16:09:41 +02:00

126 lines
4.5 KiB
MQL5

//+------------------------------------------------------------------+
//| FileArray.mq5 |
//| Copyright 2021, MetaQuotes Ltd. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\..\Include\PRTF.mqh"
const string raw = "MQL5Book/array.raw";
const string txt = "MQL5Book/array.txt";
//+------------------------------------------------------------------+
//| Struct with string fields to produce compile-time error |
//+------------------------------------------------------------------+
struct TT
{
string s1;
string s2;
};
//+------------------------------------------------------------------+
//| Base struct to be inherited |
//+------------------------------------------------------------------+
struct B
{
private:
int b;
public:
void setB(const int v) { b = v; }
};
//+------------------------------------------------------------------+
//| Demo derived struct |
//+------------------------------------------------------------------+
struct XYZ : public B
{
color x, y, z;
};
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
// test arrays of different types
long numbers1[][2] = {{1, 4}, {2, 5}, {3, 6}};
long numbers2[][2];
long numbers3[][2];
string text1[][2] = {{"1.0", "abc"}, {"2.0", "def"}, {"3.0", "ghi"}};
string text2[][2];
TT tt[];
XYZ xyz[1];
xyz[0].setB(-1);
xyz[0].x = xyz[0].y = xyz[0].z = clrRed;
// Part I. Numbers and structs
// create new file or rewrite existing file from very beginning, in binary mode
int writer = PRTF(FileOpen(raw, FILE_BIN | FILE_WRITE)); // 1 / ok
PRTF(FileWriteArray(writer, numbers1)); // 6 / ok
PRTF(FileWriteArray(writer, text1)); // 0 / FILE_NOTTXT(5012)
PRTF(FileWriteArray(writer, xyz)); // 1 / ok
FileClose(writer);
ArrayPrint(numbers1);
/*
original array
[,0][,1]
[0,] 1 4
[1,] 2 5
[2,] 3 6
*/
int reader = PRTF(FileOpen(raw, FILE_BIN | FILE_READ)); // 1 / ok
PRTF(FileReadArray(reader, numbers2)); // 8 / ok
ArrayPrint(numbers2);
/*
since we read out the file completely,
the receiving array 'numbers2' contains now not only 'numbers1',
but also 'xyz', "reformatted" into 'numbers2' geometry:
[,0] [,1]
[0,] 1 4
[1,] 2 5
[2,] 3 6
[3,] 1099511627775 1095216660735 // this is 'xyz' element
// 4 ints in 'xyz' have the same size as 2 longs in a single row of 'numbers2'
*/
// compare original array and what has been read (xyz tail is eliminated)
PRTF(ArrayCompare(numbers1, numbers2, 0, 0, ArraySize(numbers1))); // 0 / ok, equality
// now rewind the file to beginning for reading anew
PRTF(FileSeek(reader, 0, SEEK_SET)); // true
// this time we do partial reading of 3 elements to place them at index 10
PRTF(FileReadArray(reader, numbers3, 10, 3));
FileClose(reader);
ArrayPrint(numbers3);
/*
restored array numbers3 holds a part of original, 3 elements: 1, 4, 2;
they placed at index 10[5,0] in the receiving array,
elements marked by asterisk (') are random
[,0][,1]
[0,] '1 '4
[1,] '1 '4
[2,] '2 '6
[3,] '0 '0
[4,] '0 '0
[5,] 1 4
[6,] 2 '0
*/
// Part II. Strings
// create new file or rewrite existing file from very beginning, in text mode
writer = PRTF(FileOpen(txt, FILE_TXT | FILE_ANSI | FILE_WRITE)); // 1 / ok
// compile-time error:
// FileWriteArray(writer, tt); // structures or classes containing objects are not allowed
PRTF(FileWriteArray(writer, text1)); // 6 / ok
PRTF(FileWriteArray(writer, numbers1)); // 0 / FILE_NOTBIN(5011)
FileClose(writer);
reader = PRTF(FileOpen(txt, FILE_TXT | FILE_ANSI | FILE_READ)); // 1 / ok
PRTF(FileReadArray(reader, text2)); // 6 / ok
FileClose(reader);
PRTF(ArrayCompare(text1, text2)); // 0 / ok, equality
}
//+------------------------------------------------------------------+