В этом скрипте условие FileIsEnding(handle) == false ни когда не выполнится, а по идеи должно.
Это глюк терминала или у меня в коде ошибка?
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
int handle = FileOpen("file_name.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
for(;FileIsEnding(handle) == false;)
{
Print(FileTell(handle)); //здесь всегда возвращает ноль
}
//----
return(0);
}
//+------------------------------------------------------------------+
Не должно. Ошибка в коде. Указатель кто переводить будет? Читать маны про FileSeek.
int FileTell( | int handle) |
Функция возвращает смещение текущей позицию файлового указателя от начала файла.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Правильно сказал TheXpert. Ты ведь ничего не читаeшь, указатель и не переводится.
int FileTell( | int handle) |
Функция возвращает смещение текущей позицию файлового указателя от начала файла.
Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
Правильно сказал TheXpert. Ты ведь ничего не читаeшь, указатель и не переводится.
Извените конечно, но то ли Вы меня не понимаете то ли я Вас. Попробую вопрос задать по другому.
У меня этот цикл вечный, а у Вас?
int handle = FileOpen("code_candle.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
for(;FileIsEnding(handle) == false;)
{
//здесь что-то делаем, пока FileIsEnding == false
}
При работе с функцией FileIsEnding() я заметил некоторые особенности.
Если нет явных операций считывания из файла, но при этом файловый указатель перемещать с помощью функции FileSeek(), то FileIsEnding() никогда не вернет TRUE.
Например, если пример приведенный выше дополнить функцией перемещения указателя, то ничего не изменится.
Цикл останется бесконечным. Хотя в логе мы увидим, что файловый указатель перемещается.
//+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- int handle = FileOpen("file_name.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';'); for(;FileIsEnding(handle) == false;) { Print(FileTell(handle)); FileSeek(handle,1,SEEK_CUR); //сместить указатель на 1 байт } //---- return(0); } //+------------------------------------------------------------------+
Приведенный код корректно работает только в том случае, если есть явная операция считывания.
//+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- int handle = FileOpen("file_name.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';'); for(;FileIsEnding(handle) == false;) { FileReadString(handle); //прочитать строку Print(FileTell(handle)); } //---- return(0); } //+------------------------------------------------------------------+
Ну и последнее. Если теперь последней функцией добавить перемещение указателя, то FileIsEnding() опять никогда не вернет TRUE.
Цикл снова станет бесконечным.
//+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //---- int handle = FileOpen("file_name.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';'); for(;FileIsEnding(handle) == false;) { FileReadString(handle); //прочитать строку Print(FileTell(handle)); FileSeek(handle,1,SEEK_CUR); //сместить указатель на 1 байт } //---- return(0); } //+------------------------------------------------------------------+
Не знаю, чем объяснить такое странное поведение.
При работе с функцией FileIsEnding() я заметил некоторые особенности.
Если нет явных операций считывания из файла, но при этом файловый указатель перемещать с помощью функции FileSeek(), то FileIsEnding() никогда не вернет TRUE.
Например, если пример приведенный выше дополнить функцией перемещения указателя, то ничего не изменится.
Цикл останется бесконечным. Хотя в логе мы увидим, что файловый указатель перемещается.
Приведенный код корректно работает только в том случае, если есть явная операция считывания.
Ну и последнее. Если теперь последней функцией добавить перемещение указателя, то FileIsEnding() опять никогда не вернет TRUE.
Цикл снова станет бесконечным.
Не знаю, чем объяснить такое странное поведение.
Значит не у одного меня этот глюк. Спасибо за разъяснения. Не поверите два дня бился над кодом, упрощал его выкидывал из тела цикла все лишнее, а надо было наоборот усложнять.
Еще раз огромное спасибо.
Я надеялся, что кто-нибудь откликнется.
Не могу понять почему вот такой простой код считывания одного символа из файла зацикливается.
int start() { int char, handle; //---- открываем файл для чтения handle = FileOpen("sample.csv",FILE_BIN|FILE_READ); if(handle<0) return(-1); //---- цикл чтения из файла while(!FileIsEnding(handle)) { char = FileReadInteger(handle,CHAR_VALUE); //считываем один символ //---- if(!FileSeek(handle,1,SEEK_CUR)) //смещаем указатель на 1 байт { Print("Ошибка перемещения файлового указателя"); return(-1); } Print(FileTell(handle)); } //---- return(0); }
Однако, если поменять местами куски кода чтения и перемещения файлового указателя, то скрипт работает корректно.
int start() { int char, handle; //---- открываем файл для чтения handle = FileOpen("sample.csv",FILE_BIN|FILE_READ); if(handle<0) return(-1); //---- цикл чтения из файла while(!FileIsEnding(handle)) { if(!FileSeek(handle,1,SEEK_CUR)) //смещаем указатель на 1 байт { Print("Ошибка перемещения файлового указателя"); return(-1); } //---- char = FileReadInteger(handle,CHAR_VALUE); //считываем один символ //---- Print(FileTell(handle)); } //---- return(0); }
Понятие "файловый указатель" является аналогом понятия "курсор". Файловый указатель характеризуется позицией в файле. По мере прочтения данных файловый указатель смещается вправо на одну или несколько позиций.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В этом скрипте условие FileIsEnding(handle) == false ни когда не выполнится, а по идеи должно.
Это глюк терминала или у меня в коде ошибка?
//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
int start()
{
//----
int handle = FileOpen("file_name.csv", FILE_CSV|FILE_READ|FILE_WRITE, ';');
for(;FileIsEnding(handle) == false;)
{
Print(FileTell(handle)); //здесь всегда возвращает ноль
}
//----
return(0);
}
//+------------------------------------------------------------------+