Некорректная работа функции FileTell() ... - страница 3

 

по последним наблюдениям получается, что FileTell становится сразу на конец строки. без учета где находится указатель при чтении разделителей ';'

если вместо этого разделителя поставить перевод карретки, то чтение и вывод FileTell корректным

 
sergeev:

Народ, проверьте по быстрому этот скрипт. Будем писать коллективную жалобу в сервисдеск. :)


дурной пример заразителен, терминал повис )))
 
номинация "глюк месяца" ? :)
 

Другой вариант скрипта: не будем читать символ, а сразу переместим указатель на 7 позицию. Comment выглядит так:

в журнале пишет следующее:

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 7): 7

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 24): 53

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 31): 53

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 38): 53

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 45): 53

02:57:31 Test2 EURUSD,M15: Текущая позиция (должно быть 53): 53

02:57:31 Test2 EURUSD,M15: uninit reason 0

Что еще раз доказывает, что FileTell работает неправильно. Скрипт Test2.mq4 во вложении.
Файлы:
test2.mq4  2 kb
 

Дальше в лес - больше дров. В ходе углубленных экспериментов выяснилось, что функция FileSeek() с опцией SEEK_CUR тоже работает некорректно. Вместо того, чтобы перемещать указатель с текущей позиции на указанное количество байт (как написано в документации), функция перемещает указатель на указанное количество байт считая от конца строки. Вместе с тем, правильное значение "текущей позиции указателя " в терминале существует, т.к. все переменные записываются правильно и после каждого вызова функции FileRead...() указатель КОРРЕКТНО сдвигается до ближайшего разделителя. Вот только значение текущей позиции указателя невозможно выяснить, т.к. ни одна из существующих файловых функций его не возвращает.

 
вы в сервисдеск написали?
 

По-видимому, MQ различает два понятия "файловый указатель" и "смещение текущей позиции файлового указателя". Для бинарных файлов это одно и то же. Для файлов CSV - это разные понятия, так, "смещение текущей позиции файлового указателя" после любой операции чтения будет находится в конце строки. А вот файловый указатель будет внутри строки, кроме последнего значения, считываемого из строки. В этом несложно убедиться, вставив операторы

   Print(FileIsLineEnding(handle));

после каждого Print(...) в скрипте.

bool FileIsLineEnding( int handle)
Возвращает TRUE, если файловый указатель находится в конце строки файла формата CSV, иначе возвращает FALSE. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

int FileTell( int handle)
Функция возвращает смещение текущей позицию файлового указателя от начала файла.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

 
sergeev:
вы в сервисдеск написали?

В сервисдеск не писал, т.к. на сайте метаквотов написано, что все вопросы по работе МТ4 нужно размещать на этом форуме, который они просматривают каждый день. Будем надеяться, что это на самом деле так.
 
FxRoller:

В сервисдеск не писал, т.к. на сайте метаквотов написано, что все вопросы по работе МТ4 нужно размещать на этом форуме, который они просматривают каждый день. Будем надеяться, что это на самом деле так.
На самом деле это не так. Сервисдеск - формально правильный способ связи пользователя и разработчика, а форум - факультатив. В сервисдеске вам обязаны дать ответ по существу.
Причина обращения: