Подскажите, как лучше сохранить массивы на жестком диске? - страница 2

 

Сдается мне, что у автор недостаточно внятно формулирует проблему.

Похоже, что у него осуществляется какой-то долгий цикл обработки одних и тех же переменных, но вместо того, чтобы произвести его весь, а потом результат записать в файл, автор пытается на каждой итерации писать в файл результат. Неудивительно, что если надо сделать миллион итераций, то обращение  к диску на каждой итерации - занимает слишком много времени.

 
Oleg Tsarkov:
Что то я торможу, вы имеете ввиду FileFlush()?
FileFlush - это лишь одна из файловый функций. Речь идет о комплексе работы с файлами именно в том порядке, который указан выше: открыть, записать, закрыть. Ничего сложного.
 

Ну, 1-мерные и 2-мерные массивы понятно как в файл запишутся.

а как запишутся 3-мерные, 4-мерные, структуры массивов и т.д.? 

 
Дмитрий:

Ну, 1-мерные и 2-мерные массивы понятно как в файл запишутся.

а как запишутся 3-мерные, 4-мерные, структуры массивов и т.д.? 

Двумерные и большей размерности массивы - это исключительно наши представления о них. На самом деле все это одномерные массивы с различным типом индексации. В С++, к примеру нет массивов большей размерности, чем 1. Поэтому такие массивы и структуры стоит воспринимать исключительно как буфер данных. А буфер записывается в файл путем указания количества байт, которые следует записать в этот файл. Чтобы не заморачиваться с подсчетом размера буфера, используется операция sizeof.
 

https://www.mql5.com/ru/docs/files/filewritearray

Структуры без строк и динамических массивов должны быть. 

Документация по MQL5: Файловые операции / FileWriteArray
Документация по MQL5: Файловые операции / FileWriteArray
  • www.mql5.com
Файловые операции / FileWriteArray - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

FileWriteArray в MT4 неправильно работает с double. double - 16 bit, но FileWriteArray пишет данные на диск как float (8bit). Насчёт mt5 не в курсе.

Вот примерный код, наверное с ошибками ибо не проверял. Код пишет массив double в файл

double doubleArray[];

//тут doubleArray должен быть заполнен какимито данными

int dataArraySize = ArraySize(dataArray); //записываем в переменную размер массива
int fileHandle = FileOpen("filename.dat", FILE_BIN | FILE_WRITE); // открываем файл на запись в бинарном режиме.
FileWriteInteger(fileHandle, dataArraySize);//записываем в файл размер массива
for(int i=0; i<dataArraySize; i++){
   FileWriteDouble(fileHandle, dataArraySize[i]);//записываем в файл все элементы массива по одному
}
FileClose(fileHandle);

 

Этот код наоборот читает массив double из файла:

double doubleArray[];
int fileHandle = FileOpen("filename.dat", FILE_BIN | FILE_READ); // открываем файл на чтение в бинарном режиме.
int dataArraySize = FileReadInteger(fileHandle);//читаем в переменную размер массива
ArrayResize(doubleArray, dataArraySize); //изменяем размер массива чтобы вместились все даные из файла
for(int i=0; i<dataArraySize; i++){
   dataArraySize[i] = FileReadDouble(fileHandle);//читаем из файла все элементы массива по одному
}
FileClose(fileHandle);

 

А если использовать массив float вместо double то вполне можно обойтись FileReadArray и FileWriteArray 

 
Dr.Trader:

FileWriteArray в MT4 неправильно работает с double. double - 16 bit, но FileWriteArray пишет данные на диск как float (8bit). Насчёт mt5 не в курсе.

Вот примерный код, наверное с ошибками ибо не проверял. Код пишет массив double в файл

 

Этот код наоборот читает массив double из файла:

 

А если использовать массив float вместо double то вполне можно обойтись FileReadArray и FileWriteArray 

Добрый день!

Приложите ваши примеры кода чтения и записи с использованием функций FileReadArray и FileWriteArray
Проверили у себя, вычитка дает одинаковые результаты