Escribir en el archivo en una nueva línea - página 7

 
EfremovSergey:

Es más o menos lo mismo que la bandera "ocupada" (por orden de llegada), sólo que a veces es más complicado, pero la idea es interesante, me gusta, gracias.

Probablemente, sería más fácil deshabilitar la edición compartida FILE_SHARE_WRITE y dejar que los que abren sólo leer FILE_READ leer y los que abren leer y escribir FILE_READ|FILE_WRITE obtener un error y volver a abrir el archivo. Esto sería probablemente más fácil.

 
EfremovSergey:

No entiendo muy bien qué significa esto en el contexto de guardar FileClose.

Significa que no sólo cuando se cierra el archivo, los cambios realizados se guardan en el disco.

 
string    sep=";";                                                  // знак разделителя
ushort    usep=StringGetCharacter(sep,0);                           // код знака разделителя
string    arr[];                                                    // массив данных для открытия ордера
int       h=0;                                                      // handle_1
int       h1=0;                                                     // handle_2

int OnInit()
  
  {

   EventSetMillisecondTimer(3000);

   return(INIT_SUCCEEDED);
  }

void OnDeinit(const int reason)

  {
   EventKillTimer();
  }

void OnTimer()

  {

   h=FileOpen("Copy.txt",FILE_READ|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_TXT|FILE_COMMON,";");   // open файл

   FileSeek(h,0,SEEK_SET);                      // перевод курсора в начало файла

   while(FileIsEnding(h)==false)               // построчное чтение до конца файла

     {

      string    s=FileReadString(h);                                    // чтение строки

      StringSplit(s,usep,arr);                                        // перенос подстрок в массив

      // открытие ордера с данными из массива

      OrderSend(arr[0],StrToInteger(arr[1]),StrToDouble(arr[2]),StrToDouble(arr[3]),100,0,0);

      if(FileIsEnding(h)==false)                                  // промежуточная проверка

         continue;                                               // возврат в начало по условию if

      h1=FileOpen("Copy.txt",FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_TXT|FILE_COMMON,";");  // очистка файла

      FileClose(h1);                                                   // закрытие handle_2

     }

   FileClose(h);                                                     // закрытие handle_1

   Comment ("\n H: ", h, "\n H1: ", h1);                            // вывод хэнделов на экран

  }

En el lado de la lectura, hay un indicador que permite vaciar el archivo sin cerrarlo, después de que se hayan extraído todos los datos.

En el lado de la escritura, tenemos un indicador, que no permite abrir el archivo, si ya está abierto por otro Asesor Experto.

//--- Открываем файл

      int h1=FileOpen("Copy.txt",FILE_READ|FILE_WRITE|FILE_TXT|FILE_COMMON,";");

      FileSeek(h1, 0, SEEK_END);

      FileWrite(h1,Symbol(),OP_BUYSTOP,OrderLots()*Koof,OrderStopLoss(),Slippage,0,0,IntegerToString(OrderTicket()));

      FileClose(h1);
 
// закрываем файл

El código es solo de ejemplo, le faltan funciones de comprobación de manejo de asas y tickets y cosas así, pero se acerca al resultado deseado.

Muchas gracias de nuevo a todos y mucho agradecimiento por la información y los consejos útiles.