FileIsEnding - вечный цикл

 

В этом скрипте условие 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);
}
//+------------------------------------------------------------------+

 
al.k писал (а) >>

В этом скрипте условие 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.

 
TheXpert писал (а) >>

Не должно. Ошибка в коде. Указатель кто переводить будет? Читать маны про FileSeek.

Я не о том.  Функция FileIsEnding()  ни когда не возвращает значение true, и,  по крайней мере у меня, этот код превращается в вечный цикл.

 
int FileTell( int handle)

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

Правильно сказал TheXpert. Ты ведь ничего не читаeшь, указатель и не переводится.

 
Roger писал (а) >>
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);
}
//+------------------------------------------------------------------+

Не знаю, чем объяснить такое странное поведение.

 
Ilnur писал (а) >>

При работе с функцией FileIsEnding() я заметил некоторые особенности.

Если нет явных операций считывания из файла, но при этом файловый указатель перемещать с помощью функции FileSeek(), то FileIsEnding() никогда не вернет TRUE.

Например, если пример приведенный выше дополнить функцией перемещения указателя, то ничего не изменится.

Цикл останется бесконечным. Хотя в логе мы увидим, что файловый указатель перемещается.

Приведенный код корректно работает только в том случае, если есть явная операция считывания.

Ну и последнее. Если теперь последней функцией добавить перемещение указателя, то FileIsEnding() опять никогда не вернет TRUE.

Цикл снова станет бесконечным.

Не знаю, чем объяснить такое странное поведение.

Значит не у одного меня этот глюк. Спасибо за разъяснения. Не поверите два дня бился над кодом, упрощал его выкидывал из тела цикла все лишнее, а надо было наоборот усложнять.

Еще раз огромное спасибо.

 
al.k писал (а) >>

В этом скрипте условие FileIsEnding(handle) == false ни когда не выполнится, а по идеи должно.



Ну почему же должно, если вы ничего не делаете, кроме как считываете позицию курсора? Этот глюк целиком на вашей совести.

 
Ilnur писал (а) >>

Не знаю, чем объяснить такое странное поведение.

Я надеялся, что кто-нибудь откликнется.

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

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);
}
 

Понятие "файловый указатель" является аналогом понятия "курсор". Файловый указатель характеризуется позицией в файле. По мере прочтения данных файловый указатель смещается вправо на одну или несколько позиций.

https://book.mql4.com/ru/functions/files

 
Ilnur писал (а) >>
Не знаю, чем объяснить такое странное поведение.
А зачем объяснять? Просто используйте... На попытки объяснить, доказать и прочее бесполезно и неэффективно тратится уйма энергии, которую можно было бы направить на творчество.
Причина обращения: