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

 

Всем привет!

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

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

string peremennye[];

 

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

 
Файлы видит. Видимо порядок чтения из файлов изменился? Что случилось-то???
 

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

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

Клуб Телепатов - MQL4 форум
  • www.mql5.com
Клуб Телепатов - MQL4 форум
 
i_logic:

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

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

Код большой. Дело не в коде. Вот был файл, нем по 1 числу в строке. Бот читает число как символ и присваивает переменной, а переменная - это один из значений индюка. И все работало замечательно и долго на протяжении полугода. Толи новый билд какие-то внес изменения, но теперь все индюки пляшут и не могу понять, что не так стало читаться.. Т.е у меня вопрос не почему именно у меня такая проблема, а нет ли у других таких проблем в связи с новыми билдами? Речь о последнем месяце... Я месяц бота не тестил, пока вдруг у меня терминал на серваке не завис 
 
Forex_Noob:
Код большой. Дело не в коде. Вот был файл, нем по 1 числу в строке. Бот читает число как символ и присваивает переменной, а переменная - это один из значений индюка. И все работало замечательно и долго на протяжении полугода. Толи новый билд какие-то внес изменения, но теперь все индюки пляшут и не могу понять, что не так стало читаться.. Т.е у меня вопрос не почему именно у меня такая проблема, а нет ли у других таких проблем в связи с новыми билдами? Речь о последнем месяце... Я месяц бота не тестил, пока вдруг у меня терминал на серваке не завис 
Всё это лирика.  Пока нет кода говорить не о чем.  Большой код - сделай маленький.  Демонстрацию проблемы сделай. Не сделаешь, - не морочь людям голову "изменениями терминала", а ищи ошибки в коде.
 
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

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

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

Пишется так

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

 и так далее

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

 
Forex_Noob:

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

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

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

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

 
MetaDriver:

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

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

А можешь привести кусок кода? Чем заменить?
 
Forex_Noob:
А можешь привести кусок кода? Чем заменить?
Могу, но не буду (шибко лень).  Если мне нужен произвольный доступ - всегда делаю бинарные файлы. Такова моя "культура производства".  Если достаточен последовательный достсуп - читаю последовательно переменную за переменной, попутно отслеживаю (если надо) концы строк, ну и пасу конец файла.  Логика такая.  // и никогда не использую FileSeek() для текстовых файлов.  Свят-свят.
 
Forex_Noob:

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

...

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

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

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

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

Причина обращения: