Écriture dans le fichier sur une nouvelle ligne - page 7

 
EfremovSergey:

C'est à peu près la même chose que le drapeau "occupé" (premier entré, premier sorti), seulement des fois plus compliqué, mais l'idée est intéressante, j'aime bien, merci.

Il serait probablement plus simple de désactiver l'édition partagée FILE_SHARE_WRITE et de laisser ceux qui n'ouvrent que la lecture FILE_READ lire et ceux qui ouvrent la lecture et l'écriture FILE_READ|FILE_WRITE obtenir une erreur et rouvrir le fichier. Ce serait probablement plus facile.

 
EfremovSergey:

Je ne comprends pas vraiment ce que cela signifie dans le contexte de l'enregistrement de FileClose.

Cela signifie que les modifications apportées ne sont pas seulement enregistrées sur le disque lorsque le fichier est fermé.

 
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);                            // вывод хэнделов на экран

  }

Du côté de la lecture, il existe un marquage qui permet de vider le fichier sans le fermer, après que toutes les données aient été extraites.

Du côté de l'écriture, nous avons un flagging, qui ne permet pas d'ouvrir le fichier, s'il est déjà ouvert par un autre Expert Advisor.

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

      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);
 
// закрываем файл

Le code n'est qu'un exemple, il manque des fonctions de contrôle pour gérer les poignées et les tickets et d'autres choses de ce genre, mais il est proche du résultat souhaité.

Merci encore à tous et merci pour les informations et les conseils utiles.