Что-то идёт не так, но что...

 

Если не сложно, помогите понять почему

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

string   expert_name[];

long  codeExpertMagic(string prog_name, string prog_ver)
{
   Print(__FUNCSIG__);
   string   corrent_expert_name = prog_name+" V."+prog_ver;
   Print(corrent_expert_name);
   
   bool     string_exist = false;
   
   if(readExpertName())
   {
      for(int i = 0; i < ArraySize(expert_name); i++)
      {
         StringTrimLeft(expert_name[i]);
         StringTrimRight(expert_name[i]);
         if(StringFind(expert_name[i],corrent_expert_name) >= 0)
         {
            string_exist = true;
            Print("Имя эксперта найдено в массиве имён.");
            break;
         }
      }
   }
   else
   {
      ArrayResize(expert_name,1);
      expert_name[0] = corrent_expert_name;
      string_exist = writeExpertName();
   }
   
   if(!string_exist)
   {
      Print("Имя эксперта не найдено в массиве имён.");
      ArrayResize(expert_name,ArraySize(expert_name) + 1);
      expert_name[ArraySize(expert_name) - 1] = corrent_expert_name;
      writeExpertName();
   }
   .........
}
//+------------------------------------------------------------------+
bool  readExpertName()
{
   uint     count       = 0;
   
   string   dir         = AccountInfoString(ACCOUNT_COMPANY);
                          StringReplace(dir," ","_");
   string   filename    = dir+"\\myExpertName.txt";
   if(FileIsExist(filename,FILE_COMMON))
   {
      int      filehandle  = FileOpen(filename,FILE_READ|FILE_TXT|FILE_COMMON);
      if(filehandle != INVALID_HANDLE)
      {
         count = FileReadArray(filehandle,expert_name);
         
         FileClose(filehandle);
         
         Print("Прочитан массив имён экспертов..."+string(count));
      }
   }
   
   return(count == 0 ? false : true);
}
//+------------------------------------------------------------------+
bool  writeExpertName()
{
   uint     count       = 0;
   
   string   dir         = AccountInfoString(ACCOUNT_COMPANY);
                          StringReplace(dir," ","_");
   string   filename    = dir+"\\myExpertName.txt";
   int      filehandle  = FileOpen(filename,FILE_WRITE|FILE_TXT|FILE_COMMON);
   if(filehandle != INVALID_HANDLE)
   {
      count = FileWriteArray(filehandle,expert_name);

      FileClose(filehandle);
         
      Print("Записан массив имён экспертов...");
   }
   
   return(count == 0 ? false : true);
}
//+------------------------------------------------------------------+

Где я не вижу ошибку?

 
а как надо то?
 
Renat Akhtyamov:
а как надо то?

А надо чтобы записывались только уникальные имена+версия.

 
Сергей Таболин:

А надо чтобы записывались только уникальные имена+версия.

в самом начале файл заполняется в ручную?

просто я не могу понять, откуда должен появиться какой нибудь другой эксперт?

если организован алгоритм расширения списка экспертов, то разве есть смысл записывать в файл, не проще ли заполнить массив в самом начале и работать с ним?

Документация по MQL5: Файловые операции / FileWrite
Документация по MQL5: Файловые операции / FileWrite
  • www.mql5.com
//|                                               Demo_FileWrite.mq5 | //|                        Copyright 2013, MetaQuotes Software Corp. | //|                                              https://www.mql5.com | //| Script program start function                                    | //
 
Renat Akhtyamov:

в самом начале файл заполняется в ручную?

Да нет.

   if(readExpertName())
   {
      ..........
   }
   else // если файла нет, первый элемент массива заполняется поступившем именем
   {
      ArrayResize(expert_name,1);
      expert_name[0] = corrent_expert_name;
      string_exist = writeExpertName();
   }
 
Renat Akhtyamov:

в самом начале файл заполняется в ручную?

просто я не могу понять, откуда должен появиться какой нибудь другой эксперт?

если организован алгоритм расширения списка экспертов, то разве есть смысл записывать в файл, не проще ли заполнить массив в самом начале и работать с ним?

Не проще.

Видите в коде: FILE_COMMON

 
Vitaly Muzichenko:

Не проще.

Видите в коде: FILE_COMMON

то есть файл общий?

тогда флаг нужен на общий доступ к файлу плюсом

https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл...
 
Renat Akhtyamov:

то есть файл общий?

тогда флаг нужен на общий доступ к файлу плюсом

https://www.mql5.com/ru/docs/constants/io_constants/fileflags

Завтра попробую добавить FILE_SHARE_WRITE

 
Сергей Таболин:

Если не сложно, помогите понять почему

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

string   expert_name[];
count = FileWriteArray(filehandle,expert_name);

Где я не вижу ошибку?

Цитата из документации

Записывает в бинарный файл массивы любых типов, кроме строковых (может быть массив структур, не содержащих строки и динамические массивы).


 
Alexey Viktorov:

Цитата из документации

Примечание

Строковый массив может записываться только в файл типа TXT. В этом случае строки автоматически завершаются символами конца строки "\r\n". 
В зависимости от типа файла ANSI или UNICODE, строки преобразовываются к ansi-кодировке, или нет.

Уж читайте полностью.

 
Сергей Таболин:

Уж читайте полностью.

Ну спасибо. Неоднократно говорил людям чтобы читали документацию до конца, но сам на этом-же попался... Читал неоднократно и попался.)))))