Вопрос разработчикам.

 
Простейший кусок кода скрипта работает оччень интересным образом.
Речь идет осчитывании символов из файла отчёта функцией.
FileReadString()работает по своему желанию.
Ниже привожу код скрипта и лог



#property copyright "Kiktra"
#property show_inputs
extern string FileName         = "11.htm";   // Файл отчёта


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  int i_fh=0;      //-ПЕРЕМЕННАЯ ДЛЯ ХЕНДЛА                                                                     //
  string s_str;    //-основной строковый буфер                                                                  //
  string s_str1;   //-вспомогательный строковый буфер                                                           //
                                                                                                                //
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  void start()
{
  i_fh=FileOpen(FileName, FILE_BIN|FILE_READ);//открытие файла и получение хендла в переменную
  
  if (i_fh>0)//если хендл получен то.....
  {
    FileSeek(i_fh, 4089, SEEK_SET);            
     
s_str="";
                                       
s_str1=FileReadString(i_fh, 246);//здесь происходит считывание  246 символов в переменную 
 Alert(s_str1);//это подтверждается логом 
                       
s_str1="";   
                                                                                  

s_str1=FileReadString(i_fh,17);// а здесь ошибка! 
Alert(s_str1);//в логе видно как считывается только один символ вместо 17!!!!!!!!!!!!!!!
                                     

                 
   FileClose(i_fh);
   
 }          
 

 }
 
 /*
  Если закомментировать FileSeek() то ошибка исчезает

  Если укоротить Файл отчёта из которого читаем строки, с конца, то ошибка исчезает тоже

 */




22:40:08 00 GBPUSD,M5: loaded successfully
22:40:12 00 GBPUSD,M5: Alert: Баланс</td></tr>\n<tr align=right><td>1</td><td class=msdate>2001.01.12 17:20</td><td>sell</td><td>1</td><td>0.10</td><td>1.4760</td><td align=right>1.4795</td><td align=right>1.4685</td><td colspan=2></td></tr>\n<tr bgcolor="#E0E0E0" align=right
22:40:12 00 GBPUSD,M5: Alert: >



/*
видно как первый алерт записывает 246 символов в лог
следующий второй алерт подтверждает что вместо семнадцати символов в переменой s_str1 по необЪяснимым причинам оказался только один символ




Я не исключаю того что я в чём то не прав.
Но уже проверил всё по 50 раз.

Может подскажите что нибудь?

 
Все очень просто, если проверить в 51-й раз.

Считывается 17 символов, если они есть. Просто после символа ">" стоит перенос строки и остальная часть строки не показывается.
Если Вы поставите, код вида:

Alert(StringLen(s_str1));


После:

Alert(s_str1);//в логе видно как считывается только один символ вместо 17!!!!!!!!!!!!!!!


То увидите правильную длину строки.


 
Уважаемый Arthur
я сделал так как вы сказали и получил подтверждение что в строке один символ а не семнадцать
привожу изменённый скрипт а затем лог.

Кстати после символа > нет переноса строки.Перенос строки встречается в двух местах В первом
верхнем Alert() в логе его видно это два символа "\n"
И почему это тогда в верхнем Alert() перенос строки печатается в лог а внижнем Alert() нет?!

Скрипт должен был считать вот такую строку "> <td>2</td><td c"
а считывает только ">"

Хочется добавить что что файл откуда я считываю строки имеет размер около 80 кб
и до его окончания от того места откуда я считываю строки оччень далеко.
А дистрибутив МТ4 скачан с вашего сайта три дня назад

#property copyright "Kiktra"
#property show_inputs
extern string FileName         = "11.htm";   // Файл отчёта


//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+

 
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  int i_fh=0;      //-ПЕРЕМЕННАЯ ДЛЯ ХЕНДЛА                                                                     //
  string s_str;    //-основной строковый буфер                                                                  //
  string s_str1;   //-вспомогательный строковый буфер                                                           //
                                                                                                                //
 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// 
  void start()
{
  i_fh=FileOpen(FileName, FILE_BIN|FILE_READ);//открытие файла и получение хендла в переменную
  
  if (i_fh>0)//если хендл получен то.....
  {
    FileSeek(i_fh, 4089, SEEK_SET);            
     
s_str="";
                                       
s_str1=FileReadString(i_fh, 246);//здесь происходит считывание  246 символов в переменную 
 Alert(s_str1);//это подтверждается логом 
                       
s_str1="";   
                                                                                  

s_str1=FileReadString(i_fh,17);// а здесь ошибка! 
Alert(s_str1);//в логе видно как считывается только один символ!!!!!!!!!!!!!!!
Alert(StringLen(s_str1));                                     

                 
   FileClose(i_fh);
   
 }          
 

 }
 
 /*
  Если закомментировать FileSeek() то ошибка исчезает
  Если укоротить Файл отчёта из которого читаем строки то ошибка исчезает
 */



Лог


20:00:15 00 GBPUSD,M5: loaded successfully
20:00:15 00 GBPUSD,M5: Alert: Баланс</td></tr>\n<tr align=right><td>1</td><td class=msdate>2001.01.12 17:20</td><td>sell</td><td>1</td><td>0.10</td><td>1.4760</td><td align=right>1.4795</td><td align=right>1.4685</td><td colspan=2></td></tr>\n<tr bgcolor="#E0E0E0" align=right
20:00:15 00 GBPUSD,M5: Alert: >
20:00:15 00 GBPUSD,M5: Alert: 1




 
Уважаемый Kikitra,

Не могли бы Вы выслать файл на arthur AT metaquotes DOT ru?
Без этого файла остается только делать предположения, не так ли?
 
Я выслал Вам файл.
 
Я выслал Вам файл.

Что-то я ничего не получил..
 
Выслал во второй раз с другого ящика.
 
Присланный файл сразу помог понять причину проблемы.
Давайте посчитаем: 4089+246=4335, в HEX будет: 10EF - это смещение с которого начинаются проблемы. Теперь просмотрим присланный файл в бинарном виде:



Итак, функция FileReadString считывает один символ ">", после чего останавливается на НУЛЕ! И это правильное и естественное поведение функции.

Самое интересное в расследовании причины, оказалось то, что браузеры нормально воспринимают этот HTML-файл. Не обращая внимание на 0. Но мы должны укладываться в заложенный функционал.
 
Кстати, лучше такие вещи обсуждать на "MQL4: automated forex trading" . Все-таки там специализированный форум.
 
Да всё правильно так и есть, спасибо за разъяснение.
Тип string не содержит нулевых байтов.
Чтотто я протупил с нулевыми байтами, сейчас заменил их на пробелы и все пошло как по маслу.
Файл отчёта от замены не пострадал.
Но хочется узнать может ли Metaquotes со своей стороны сделать так
что бы тестер МТ4 перестал генерить htm файлы отчёты с нулевыми байтами.
Ведь я этот файл не на дороге нашёл.
Не было бы нулевых байтов в файлах отчётов, не было бы этой ветки на форуме.
Получается что кроме FileReadArray() для чтения из файлов отчета на этот момент
ничего нельзя использовать.

Кстати сомневаюсь что на "MQL4: automated forex trading" мне бы просто так ответили,
всё равно пришлось бы привлекать ваших специалистов.
Есть там и образцы скриптов которые читают файлы отчетов они то как раз и используют FileReadString()
и ничего, всем нравится.
 
Но хочется узнать может ли Metaquotes со своей стороны сделать так
что бы тестер МТ4 перестал генерить htm файлы отчёты с нулевыми байтами.
Ведь я этот файл не на дороге нашёл.


Это хорошое замечание - посмотрим, исправим.
Причина обращения: