Скачать MetaTrader 5

Вопрос на грани телепатии, но видимо что-то я пропустил

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
На MQL5.community есть возможность хранить исходные коды в MQL5 Storage. Попробуй сам!
Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 21:14 

Всем привет!

У меня вдруг стали данные из файлов грузится криво. Ничего не трогал месяц как. Все работало. Из файлов значения индюков подгружаются. Полгода все норм, а теперь все скачет.

Данные подгружаются в сточный массив и потом присваиваются переменной через StringToDouble. Кстати строчный массив раньше выглядел так:

string peremennye[];

 

 а теперь на загрузке 10 элемента выдает эррей аут оф рендже. Что за фигня... ниче не понимаю... До сегодня полгода все работало...

Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 21:25  
Файлы видит. Видимо порядок чтения из файлов изменился? Что случилось-то???
Igor Konyashin
3110
Igor Konyashin 2013.12.24 21:33  

А код не прикладываете потому что он секретный?

Без кода трудно будет сказать что-то. Действительно телепатией придется пользоваться.

Клуб Телепатов - MQL4 форум
  • www.mql5.com
Клуб Телепатов - MQL4 форум
Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 21:41  
i_logic:

А код не прикладываете потому что он секретный?

Без кода трудно будет сказать что-то. Действительно телепатией придется пользоваться.

Код большой. Дело не в коде. Вот был файл, нем по 1 числу в строке. Бот читает число как символ и присваивает переменной, а переменная - это один из значений индюка. И все работало замечательно и долго на протяжении полугода. Толи новый билд какие-то внес изменения, но теперь все индюки пляшут и не могу понять, что не так стало читаться.. Т.е у меня вопрос не почему именно у меня такая проблема, а нет ли у других таких проблем в связи с новыми билдами? Речь о последнем месяце... Я месяц бота не тестил, пока вдруг у меня терминал на серваке не завис 
Vladimir Gomonov
8277
Vladimir Gomonov 2013.12.24 22:02  
Forex_Noob:
Код большой. Дело не в коде. Вот был файл, нем по 1 числу в строке. Бот читает число как символ и присваивает переменной, а переменная - это один из значений индюка. И все работало замечательно и долго на протяжении полугода. Толи новый билд какие-то внес изменения, но теперь все индюки пляшут и не могу понять, что не так стало читаться.. Т.е у меня вопрос не почему именно у меня такая проблема, а нет ли у других таких проблем в связи с новыми билдами? Речь о последнем месяце... Я месяц бота не тестил, пока вдруг у меня терминал на серваке не завис 
Всё это лирика.  Пока нет кода говорить не о чем.  Большой код - сделай маленький.  Демонстрацию проблемы сделай. Не сделаешь, - не морочь людям голову "изменениями терминала", а ищи ошибки в коде.
Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 22:10  
MetaDriver:
Всё это лирика.  Пока нет кода говорить не о чем.  Большой код - сделай маленький.  Демонстрацию проблемы сделай. Не сделаешь, - не морочь людям голову "изменениями терминала", а ищи ошибки в коде.
 int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_ANSI|FILE_COMMON);
//--- Если хэндл файла получен
   if(file_handle!=INVALID_HANDLE)
     {
      ulong  offset =0; // Смещение для определения положения файлового указателя
      string text ="";  // В эту переменную будем записывать прочитанную строку
      //--- Читать, пока текущее положение файлового указателя не окажется в конце файла или программа не будет удалена
      while(!FileIsEnding(file_handle) || !IsStopped())
        {
         //--- Читать до конца строки или пока программа не будет удалена
         while(!FileIsLineEnding(file_handle) || !IsStopped())
           {
            //--- Прочитаем всю строку
            text=FileReadString(file_handle);
            //--- Получим положение указателя
            offset=FileTell(file_handle);
            //--- Переход на другую строку, если это не конец файла
            //    Для этого увеличим смещение указателя файла
            if(!FileIsEnding(file_handle))
               offset++;
            //--- Переведем его на следующую строку
            FileSeek(file_handle,offset,SEEK_SET);
            //--- Если строка не пустая
            if(text!="")
              {
               //--- Увеличим счетчик строк
               strings_count++;
               //--- Увеличим размер массива строк,
               ArrayResize(peremennye,strings_count);
               //--- Запишем прочитанную строку в текущий индекс
               peremennye[strings_count-1]=text;
              }
            //--- Выйдем из вложенного цикла
            break;
           }
         //--- Если это конец файла прервем основной цикл
         if(FileIsEnding(file_handle))
            break;
        }
      //--- Закроем файл
      FileClose(file_handle);}

Вот этот код читает данные из файла. 

Вот кусок файла к прочтению

 


0

0

0

1

0

0

0

0

0

0

0

0

0

0

10

0

0

0

а вот результат (читать снизу вверх):

 2013.12.25 01:04:42.257 2000.01.01 00:00:00   0 и следом ошибка размера массива.

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0.0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0.0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   10

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

2013.12.25 01:04:42.257 2000.01.01 00:00:00   0

И такого раньше (месяц или два назад) не было. Бот не правил за это время. Переменных подгружается куча - больше трех сотен. Поэтому все не привожу. 
Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 22:20  

Получается, что сейчас данные читаются не последовательно, а через интервал... и не понятно через какой. Может кодировка влияет при записи в файл

Пишется так

filehandle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_ANSI|FILE_COMMON);
FileWrite(filehandle,a);FileSeek(filehandle,0,SEEK_END);

 и так далее

Полюбому что-то изменилось. Код ни при чем. Все работало как часы.  Поэтому и формулирую проблему: "какие изменения произошли в последнее время при чтении/записи в фалы?"

Vladimir Gomonov
8277
Vladimir Gomonov 2013.12.24 22:25  
Forex_Noob:

Вот этот код читает данные из файла. 

Вот кусок файла к прочтению

Не советывал бы использовать FileSeek() для текстовых файлов.  Вообще никогда. Это сервис для файлов с произвольным побайтным доступом, а никак не для текстовых.  Если пользуешься на свой страх и риск - должен отдавать себе отчёт в том, что надёжной работы может и не быть.  Короче, не советую даже сервисдеск напрягать. Лучше переделай по человечески.

Т.е. читай только всё подряд, от начала и до конца, файловый указатель "вручную" не переставляй.  Всю логику отлаживай в рамках этих ограничений.  И будет тебе щастье.

Artem Mordvinkin
1003
Artem Mordvinkin 2013.12.24 22:27  
MetaDriver:

Не советывал бы использовать FileSeek() для текстовых файлов.  Вообще никогда. Это сервис для файлов с произвольным побыйтным доступом, а никак не для текстовых.  Если пользуешься на свой страх и риск - должен отдавать себе отчёт в том что надёжной работы может и не быть.  Короче, не советую даже сервисдеск напрягать. Лучше переделай по человечески.

Т.е. читай только всё подряд, от начала и до конца, файловый указатель "вручную" не переставляй.  Всю логику отлаживай в рамках этих ограничений.  И будет тебе щастье.

А можешь привести кусок кода? Чем заменить?
Vladimir Gomonov
8277
Vladimir Gomonov 2013.12.24 22:38  
Forex_Noob:
А можешь привести кусок кода? Чем заменить?
Могу, но не буду (шибко лень).  Если мне нужен произвольный доступ - всегда делаю бинарные файлы. Такова моя "культура производства".  Если достаточен последовательный достсуп - читаю последовательно переменную за переменной, попутно отслеживаю (если надо) концы строк, ну и пасу конец файла.  Логика такая.  // и никогда не использую FileSeek() для текстовых файлов.  Свят-свят.
Anatoli Kazharski
56950
Anatoli Kazharski 2013.12.25 08:07  
Forex_Noob:

Получается, что сейчас данные читаются не последовательно, а через интервал... и не понятно через какой. Может кодировка влияет при записи в файл

...

Полюбому что-то изменилось. Код ни при чем. Все работало как часы.  Поэтому и формулирую проблему: "какие изменения произошли в последнее время при чтении/записи в фалы?"

У меня тоже такая проблема возникла недавно. Сервисдеск помог. ) Теперь это нужно делать вот так. При открытии файла указать разделитель (выделено красным):

int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_ANSI|FILE_COMMON,"\n");

Файловый указатель в Вашем примере больше не нужен. В итоге всё даже ещё проще стало, чем было раньше.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий