Не записывает данные в файл.

 

Доброго времени суток.

Мне необходимо, чтобы эксперт записывал данные типа float из массива в файл. При запуске, эксперт находит файл, успешно открывает его с флагами и записывает туда данные из массива, возвращая количество записанных элементов, но когда открываю файл, там пусто.
Пробовал так же FileWriteArray и FileWriteFloat, там получается точно так же. 
Изменять файл можно, проверял.

string DataBaseFileName2 = "NeiroDataBase.txt"; 

float Massive[7]; 

int OnInit() { 
        if (FileIsExist(DataBaseFileName2, FILE_COMMON)) { 
                Print("File " + DataBaseFileName2 + " successfully found"); 
        } else { 
                Print("ERROR: File " + DataBaseFileName2 + " not found in ...Terminal/Common/Files"); 
                return(INIT_FAILED); 
        } 
        Massive[0] = 1.5; 
        Massive[1] = 2; 
        Massive[2] = 3.6; 
        Massive[3] = 4; 
        Massive[4] = 5.4; 
        Massive[5] = 6; 
        Massive[6] = 7.1; 
        int FileHandl2 = FileOpen(DataBaseFileName2, FILE_WRITE); 
        int result = FileWrite(FileHandl2, Massive[3]); 
        Print("Element's 1 writing == " + result); 
        FileClose(FileHandl2); 
        return(INIT_SUCCEEDED); 
}
 
dron9_7:

Доброго времени суток.

Мне необходимо, чтобы эксперт записывал данные типа float из массива в файл. При запуске, эксперт находит файл, успешно открывает его с флагами и записывает туда данные из массива, возвращая количество записанных элементов, но когда открываю файл, там пусто.
Пробовал так же FileWriteArray и FileWriteFloat, там получается точно так же. 
Изменять файл можно, проверял.

Ваши ошибки: 

  • открываете файл с расширением ".txt" хотя FileWriteFloat пишет в ".bin"
  • нет проверки на успешность открытия файла, соответственно результат не известен
  • проверяете наличие файла в общей папке(FILE_COMMON), а открываете файл для записи в папке терминала (если файл открывается для записи то его наличие проверять необязательно) 
  • ArrayResize в Вашем примере лишняя

В общем загляните в справку, там по работе с файлами много примеров.

p.s. Вот ещё хорошая статья с примерами https://www.mql5.com/ru/articles/2720#z8

Основы программирования на MQL5: Файлы
Основы программирования на MQL5: Файлы
  • www.mql5.com
Функции для работы с файлами есть почти во всех языках программирования, и MQL5 в этом смысле — не исключение. Хотя при программировании советников и индикаторов на MQL5 работать с использованием файлов приходится не всегда, (а скорее даже — очень редко), но тем не менее, каждый экспертописатель рано или поздно с этим сталкивается. Диапазон...
 
Sergey Kolemanov:

Ваши ошибки: 

  • открываете файл с расширением ".txt" хотя FileWriteFloat пишет в ".bin"
  • нет проверки на успешность открытия файла, соответственно результат не известен
  • проверяете наличие файла в общей папке(FILE_COMMON), а открываете файл для записи в папке терминала (если файл открывается для записи то его наличие проверять необязательно) 
  • ArrayResize в Вашем примере лишняя

В общем загляните в справку, там по работе с файлами много примеров.

p.s. Вот ещё хорошая статья с примерами https://www.mql5.com/ru/articles/2720#z8

  • Ошибочно написал FileWritaFloat, по факту использую FileWrite
  • Проверка есть, просто не добавлял её сюда, чтобы не мусорить - Print("FileHandl2 = " + FileHandl2);
  • Странно, ведь файл открывается судя по тому что Handl файла появляется. По дефолту при открытии файла для записи, в какую директорию смотрит эксперт?
  • Так-же ошибочно его сюда добавил т.к. использовал динамический массив раньше и забыл убрать указание размера.

 
Проверяете существование в общей папке, а пишите в паку терминала.
 
Dmitry Fedoseev:
Проверяете существование в общей папке, а пишите в паку терминала.

А каким образом в FileOpen указать директорию к файлу?

 
dron9_7:

  • Ошибочно написал FileWritaFloat, по факту использую FileWrite
  • Проверка есть, просто не добавлял её сюда, чтобы не мусорить - Print("FileHandl2 = " + FileHandl2);
  • Странно, ведь файл открывается судя по тому что Handl файла появляется. По дефолту при открытии файла для записи, в какую директорию смотрит эксперт?
  • Так-же ошибочно его сюда добавил т.к. использовал динамический массив раньше и забыл убрать указание размера.

Вот Ваш немного изменённый код в виде скрипта, всё работает.

#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

string file_name = "NeiroDataBase.txt";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{  
   float Massive[7] = {1.5, 2.0, 3.6, 4.0, 5.4, 6.0, 7.1};
   
   ResetLastError();
   int handle = FileOpen(file_name, FILE_WRITE);
   //----
   if(handle != INVALID_HANDLE)
   {
      FileWrite(handle,
                Massive[0], 
                Massive[1], 
                Massive[2], 
                Massive[3], 
                Massive[4], 
                Massive[5], 
                Massive[6]); 
                 
      FileClose(handle);
   }
   else Print("Ошибка открытия файла, err = ", GetLastError());

}
 
dron9_7:

А каким образом в FileOpen указать директорию к файлу?

FILE_COMMON
Указывать или не указывать
 
Dmitry Fedoseev:
Указывать или не указывать

Точно, вот этого я и не заметил в документации . . .
Спасибо большое!

Причина обращения: