Как сохранить массив структур в файл?

 

Короче задача сохранить массив структур в бинарный файл

Собственно сама структура


struct Order
  {
   string            symbol;
   int               ticket;
   int               magic;
   int               type;
   double            volume;
   double            sl;
   double            tp;
  };


Собственно код заполнения и сохранения

void OnTimer()
  {
   if(OpenOrdersTotal != OrdersTotal()) // надо поменять на что то более надежное
     {
     ArrayResize(ListPositions,OrdersTotal());
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==false) continue;
         if(OrderType()>1) continue;
         ListPositions[i].symbol = OrderSymbol();
         ListPositions[i].ticket = OrderTicket();
         ListPositions[i].magic = OrderMagicNumber();
         ListPositions[i].type = OrderMagicNumber();
         ListPositions[i].volume = OrderLots();
         ListPositions[i].sl = OrderStopLoss();
         ListPositions[i].tp = OrderTakeProfit();
        }
        store.WriteData(ListPositions);
     }
  }

Класс стора

class Store
{
public:
   Store(void){};
   
   void WriteData(Order &list[])
     {
     string save = "store.bin";
      ResetLastError();
      if(FileIsExist(save)){
         FileDelete(save);
      }
      int handle=FileOpen(save,FILE_READ|FILE_WRITE|FILE_BIN);
      if(handle!=INVALID_HANDLE)
        {
         //FileSeek(handle,0,SEEK_END);
         FileWriteArray(handle,list,0);
         FileClose(handle);
        }
      else
         Print("Failed to open the file, error ",GetLastError());
     }
};


иии короче выясняется что функция FileWriteArray ожидает массив в котором нет массва структур.черт меня это поставило немного в тупик.

Поковырявшись в учебнике я не чего не нашел подходящего для решения этой проблемы.

Может и прямого решения в лоб нет, - кто нибуть сталкивался с такой задачей?

Какие есть идеи?

 

Записывайте массив при помощи цикла. Саму структуру пишите через FileWriteStruct():

int nTotal = ArraySize(list);
FileWriteInteger(habdle, nTotal); // Запись размера массива для того, чтобы корректно потом прочитать массив
for (int i = 0; i < nTotal; +i)
  FileWriteStruct(handle, list[i]);
P. S. Упс., не увидел, что в структуре есть string. А строки - это данные переменной длины. Тогда FileWriteStruct() не поможет. Нужно самому писать сериализацию для структуры.
 

Тоже щас об этом подумал, если кому интересно щас в качестве примера смотрю вот этот код, там как раз чувак массив структур пишет в файл

http://investflow.ru/docs/mql4/api/FileWriteStruct

FileWriteStruct, язык MQL4
  • investflow.ru
[in]  Количество байт, которые нужно записать. Если размер не указан или указано большее количество байт, чем размер структуры, то записывается вся структура полностью. В случае удачи функция возвращает количество записанных байт или 0 в случае ошибки. При успешном завершении количество записанных байт равно размеру структуры...
 
@Ihor Herasko - А в mql4 нет строк фиксированной длины? - типо как в C++ можно написать char a[255];
 
0x41:
@Ihor Herasko - А в mql4 нет строк фиксированной длины? - типо как в C++ можно написать char a[255];

Это не строка, а массив символов. В него как раз и нужно будет преобразовать тип string. Делается это при помощи функций StringToCharArray() - для char, StringToShortArray() - для wide char.

 
О я как раз это и ищу - извините за глупые вопросы, я просто на mql4 первый день пишу :) после С++ и php не много не привычно.
 
А разве не сохраняется через FileWriteArray()
 
Dmitry Fedoseev:
А разве не сохраняется через FileWriteArray()? 

там в структуре одна переменная типа стринг

 

вот делали такую задачу https://www.mql5.com/ru/forum/85652/page17#comment_12370424

метод Save() посмотрите, там запись строк

 
0x41:

Короче задача сохранить массив структур в бинарный файл

Собственно сама структура



Собственно код заполнения и сохранения

Класс стора


иии короче выясняется что функция FileWriteArray ожидает массив в котором нет массва структур.черт меня это поставило немного в тупик.

Поковырявшись в учебнике я не чего не нашел подходящего для решения этой проблемы.

Может и прямого решения в лоб нет, - кто нибуть сталкивался с такой задачей?

Какие есть идеи?

Структура - всегда строка. Массив структур - массив строковых данных. Никто не мешает сравнивать элементы этих массивов целиком, без детализации по элементам. Главное - не забывать о выравнивании. 

 
Alexandr Andreev:

там в структуре одна переменная типа стринг

Что-то как-то промеж глаз она попала. Тогда вместо нее использовать массив uchar фиксированного размера. Если известен максимальный размер строк. А если в строке может быть что угодно, тогда писать свою функцию сохранения в текстовый файл.

Причина обращения: