Ошибка открытия html

 
Доброго времени суток ! Столкнулся с такой ошибкой : в цикле через определенный период времени открывается и считывается файл html с помощью скрипта https://www.mql5.com/ru/articles/1544, ReportHTMLtoSCV.mq4 . Все какбы хорошо, но до определенного момента на 16-том повторе открыть файл html выдает ошибку -  FileOpen - too many opened files. и уже не открывает его, хотя как так получается если все 15 раз до етого все открывалось а на 16 уже выдает ошибку, а процесс все тотже . Подскажите кто знает в чем может быть дело ?
Файлы:
 
FileOpen - too many opened files - слишком много открытых файлов.
 
drknn:
FileOpen - too many opened files - слишком много открытых файлов.
спасибо, ето я знаю, но как применить ето к данной ситуации ?, получается что открываемые html файлы не были закрыты или как ? но функция FileClose(),  присутсвует потому не должно такого быть
 
Invest777:
спасибо, ето я знаю, но как применить ето к данной ситуации ?, получается что открываемые html файлы не были закрыты или как ? но функция FileClose(), присутсвует потому не должно такого быть
Проверять на ошибки надо, и если они есть, то закрывать файл. По моему, не помню точно, количество одновременно открытых файлов не более 32.
 

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

В случае, если открываемый Вами файл содержит всего одну строку (или файл пустой), то что происходит? В цикле счётчик строк принимает значение = 1, и сразу за циклом Вы вычитаете 1 из счётчика - он обнуляется. Далее Вы проверяете, если счётчик более нуля, то отдаёте приказ закрыть файл. А если менее нуля или равно нулю? То файл остаётся открыт!!!

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

 
Invest777, Пишу этот пост специально чтоб поднять ветку вверх форума, чтоб она не затерялась в последующих страницах. Вы так и не отписались по результатам. Как там у Вас дела с кодом?
 
drknn:

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

В случае, если открываемый Вами файл содержит всего одну строку (или файл пустой), то что происходит? В цикле счётчик строк принимает значение = 1, и сразу за циклом Вы вычитаете 1 из счётчика - он обнуляется. Далее Вы проверяете, если счётчик более нуля, то отдаёте приказ закрыть файл. А если менее нуля или равно нулю? То файл остаётся открыт!!!

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



спасибо большое за розяснение  , буду пробывать, так как я логически тоже понимаю проблему, но вопрос как в коде все правельно описать, вроде функция закрытия файла присутствует, потому нелогично что файлы остаються открытыми.А если ошибка закрытия, то по какой причине ...
 
Invest777:


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


Вот так:

// ------------------- FileTodayCreate() ---------------------------------------------------------
// функция создаёт файл-выборку из указанного файла в указанный файл
// -----------------------------------------------------------------
void FileTodayCreate(string DB_File,string RezFile){
        string          NameFunction="FileTodayCreate()",Stroka,s_TempDate,s_TempTime,s_Rezult;
        int             SchStrokInFile;
        int             Fl_Hndl=(-1);
        
        SchStrokInFile=(-1);
        SchStrokInFile=SchFileStrok(DB_File);
        Fl_Hndl=FileOpen(DB_File,FILE_CSV|FILE_READ,";");// открываем основной файл (базу данных).
        if(Fl_Hndl>(-1)){
          for(int down=1;down<=SchStrokInFile;down++){
            // тут у Вас что-то происходит в цикле
          }
                
        }
        FileClose(Fl_Hndl);// Закрываем файл
}
 
а вот еще вопрос по массивам, если использовать функцию ArrayInitialize, с помощью нее можно обнулить массив типа double, но как обнулить массив типа string ?
 
Invest777:
а вот еще вопрос по массивам, если использовать функцию ArrayInitialize, с помощью нее можно обнулить массив типа double, но как обнулить массив типа string ?
в цикле.
 
sergeev:
в цикле.


а можно пожалуйсто в коде описать ?