FileWriteStruct

La funzione scrive nel contenuto di un file-bin una struttura passata come parametro, partendo dalla posizione corrente del puntatore del file.

uint  FileWriteStruct(
   int          file_handle,       // File handle
   const void&  struct_object,     // Link ad un oggetto
   int          size=-1            // Grandezza da scrivere in byte
   );

Parametri

file_handle

[in] Il descrittore di file restituito da FileOpen().

struct_object

[in] Riferimento all'oggetto di questa struttura. La struttura non deve contenere stringhe, array dinamici o funzioni virtuali.

size=-1

[in] Numero di byte che si desidera registrare. Se la grandezza non è specificata o il numero specificato di byte è maggiore della grandezza della struttura, viene scritta l'intera struttura.

Valore restituito

In caso di successo la funzione restituisce il numero di byte scritti. Il puntatore del file viene spostato dello stesso numero di byte.

Esempio:

//+--------------------------------------------------------------------------------+
//|                                                        Demo_FileWiteStruct.mq5 |
//|                                      Copyright 2013, MetaQuotes Software Corp. | 
//|                                                           https://www.mql5.com |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- mostra la finestra dei parametri di input quando si lancia lo script
#property script_show_inputs
//--- parametri per la ricezione dei dati dal terminale
input string          InpSymbolName="EURUSD";           // coppia di valute
input ENUM_TIMEFRAMES InpSymbolPeriod=PERIOD_H1;        // time frame
input datetime        InpDateStart=D'2013.01.01 00:00'; // data di inzio copiatura dati
//--- parameters for writing data to the file
input string          InpFileName="EURUSD.txt";         // nome del file
input string          InpDirectoryName="Data";          // nome directory
//+--------------------------------------------------------------------------------+
//| Struttura per memorizzare i dati della candela                           |
//+--------------------------------------------------------------------------------+
struct candlesticks
  {
   double            open;  // prezzo apertura
   double            close; // prezzo chiusura
   double            high;  // prezzo più alto
   double            low;   // prezzo più basso
   datetime          date;  // data
  };
//+--------------------------------------------------------------------------------+
//| Funzione di avvio del programma Script |
//+--------------------------------------------------------------------------------+
voidOnStart()
  {
   datetime     date_finish=TimeCurrent();
   int          size;
   datetime     time_buff[];
   double       open_buff[];
   double       close_buff[];
   double       high_buff[];
   double       low_buff[];
   candlesticks cand_buff[];
//--- resetta il valore dell' errore
   ResetLastError();
//--- riceve l'orario di arrivo delle barre dal range
   if(CopyTime(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,time_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori temporali. Codice Errore = %d",GetLastError());
      return;
     }
//--- riceve i prezzi high delle barre, dal range
   if(CopyHigh(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,high_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori dei prezzi high. Codice Errore = %d",GetLastError());
      return;
     }
//--- riceve i valori low delle barre dal range
   if(CopyLow(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,low_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori dei prezzi low. Codice Errore = %d",GetLastError());
      return;
     }
//--- riceve i prezzi open delle barre, dal range
   if(CopyOpen(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,open_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori dei prezzi open. Codice Errore = %d",GetLastError());
      return;
     }
//--- riceve i prezzi close delle barre dal range
   if(CopyClose(InpSymbolName,InpSymbolPeriod,InpDateStart,date_finish,close_buff)==-1)
     {
      PrintFormat("Fallimento nel copiare i valori dei prezzi close. Codice Errore = %d",GetLastError());
      return;
     }
//--- definisce la dimensione degli array
   size=ArraySize(time_buff);
//--- salva i dati nella array struttura
   ArrayResize(cand_buff,size);
   for(int i=0;i<size;i++)
     {
      cand_buff[i].open=open_buff[i];
      cand_buff[i].close=close_buff[i];
      cand_buff[i].high=high_buff[i];
      cand_buff[i].low=low_buff[i];
      cand_buff[i].date=time_buff[i];
     }
 
//--- apre il file per la scrittura della struttura array nel file (se il file è assente, verrà creato automaticamente)
   ResetLastError();
   int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_BIN|FILE_COMMON);
   if(file_handle!=INVALID_HANDLE)
     {
      PrintFormat("il file %s viene aperto per la lettura",InpFileName);
      PrintFormat("Percorso file: %s\\Files\\",TerminalInfoString(TERMINAL_COMMONDATA_PATH));
      //--- prepara il contatore del numero di byte
      uint counter=0;
      //--- scrive i valori array nel loop
      for(int i=0;i<size;i++)
         counter+=FileWriteStruct(file_handle,cand_buff[i]);
      PrintFormat("%d byte di informazione vengono scritti nel file %s",InpFileName,counter);
      PrintFormat("Numero totale di byte: %d * %d * %d = %d, %s",size,5,8,size*5*8,size*5*8==counter ? "Correct" : "Error");
      //--- chiude il file
      FileClose(file_handle);
      PrintFormat("I dati vengono scritti, il file %s è chiuso",InpFileName);
     }
   else
      PrintFormat("Fallimento nell'aprire il file %s, Codice errore = %d",InpFileName,GetLastError());
  }

Vedi anche

Le strutture e le classi