Не удалось прочитать файл в структуру MQL5 MT5
Я пытаюсь прочитать файл в структуру, но не удалось, так как произошла ошибка компиляции. Посмотрите, что я попробовал:
struct file_row_struct
{
datetime file_time;
string file_range_green;
string file_range_red;
double file_dist_green_red;
double file_slope_green;
double file_slope_red;
string file_prev_color;
string file_current_color;
}filerow[];
int size = 1;
FileReader = FileOpen(file_read_path,FILE_READ|FILE_CSV,',');
if(FileReader != INVALID_HANDLE)
{
//while(!FileIsEnding(FileReader))
// linecount++;
while(!FileIsEnding(FileReader))
{
FileReadStruct(FileReader,filerow,size);
size++;
}
Print("File Opened successfully");
//PrintFormat("File path: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
FileClose(FileReader);
}
else Print("Not Successful in opening file: %s ", GetLastError());
Суть образца файла доступна по адресу: Пример данных
Я обнаружил ошибку компиляции:
'filerow' - structures containing objects are not allowed NeuralExpert.mq5 108 36
Пожалуйста, предложите мне, что я ошибся. Я предполагаю, что в структуре есть функция-член string, поэтому она не разрешена.
1 ответ
Структуры - это простые типы в MQL. Это означает, что вы можете иметь целочисленные и плавающие значения всех видов (все, что приведено к ulong и double) и некоторые другие. Это также означает, что в нем не может быть строк и других структур. Если у вас есть строки в структуре - вы не можете передать по ссылке и многим другим проблемам (поэтому лучше сказать, что сложные типы не поддерживаются в структурах, у вас все еще могут быть их, но вы обязаны все делать правильно).
Поскольку вы не можете передавать структуры по ссылке, вы не можете использовать FileReadStruct()
,
Что делать - я бы предложил использовать CObject-based
класс и CArrayObj
держать их вместо filerow[]
,
class CFileRow : public CObject
{
//8 fields
public:
CFileRow(const string line)
{
//convert string line that you are to read from file into class
}
~CFileRow(){}
};
CArrayObj* fileRowArray = new CArrayObj();
while(!FileIsEnding(FileReader))
{
string line=FileReadString(FileReader);
fileRowArray.Add(new CFileRow(line));
}