Не умеет читать бинарный файл

 

Не удалось прочитать двоичный файл.

Код является:

 void  OnStart  ()  
   {  
   string  f [];  
     int  file =  FileOpen  (  "testme.bin"  ,  FILE_COMMON  |  FILE_BIN  |  FILE_READ  );  
     Print  (  FileReadArray  (file, f));  
     Print  (  FileReadInteger  (file));  
     Print  (  FileReadInteger  (file));  
     Print  (  FileReadString  (file));  
     ArrayPrint  (f);  
    
     FileClose  (file);  
   
   } 

Получил вывод:

 0  
 0  
 0 

Ожидаемый результат:

 1  
 2  
 3  
 4  
 5 

Прикрепленный бинарный файл.

Пожалуйста, помогите мне.

Файлы:
testme.zip  1 kb
 
jaffer wilson:

Не удалось прочитать двоичный файл.

Код является:

Получил вывод:

Ожидаемый результат:

Прикрепленный бинарный файл.

Пожалуйста, помогите мне.

Скорее всего функция открытия не нашла файл, либо этот атрибут лишний FILE_COMMON. Пример из справки:

//--- откроем файл 
   ResetLastError(); 
   int file_handle=FileOpen(path,FILE_READ|FILE_BIN); 
   if(file_handle!=INVALID_HANDLE) 
     { 
      //--- прочитаем все данные из файла в массив 
      FileReadArray(file_handle,arr); 
      //--- получим размер массива 
      int size=ArraySize(arr); 
      //--- распечатаем данные из массива 
      for(int i=0;i<size;i++) 
         Print("Date = ",arr[i].date," Bid = ",arr[i].bid," Ask = ",arr[i].ask); 
      Print("Total data = ",size); 
      //--- закрываем файл 
      FileClose(file_handle); 
     } 
   else 
      Print("File open failed, error ",GetLastError()); 
  }
 

Создайте файл как это описано в справке, заполните его тестируемыми данными, а после уже попытайте прочитать:

//--- откроем файл 
   ResetLastError(); 
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN); 
   if(handle!=INVALID_HANDLE) 
     { 
      //--- запишем данные массива в конец файла 
      FileSeek(handle,0,SEEK_END); 
      FileWriteArray(handle,arr,0,n); 
      //--- закрываем файл 
      FileClose(handle); 
     } 
   else 
      Print("Failed to open the file, error ",GetLastError()); 
  }
 
  1. Нет проверки успешности открытия файла (нужно проверить, что в переменной file, смотрите пример из справки).
  2. Для успешного открытия файлов, кроме FILE_READ и FILE_WRITE, нужно добавлять флаги FILE_SHARE_WRITE и FILE_SHARE_READ.
 
Ihor Herasko:
  1. Нет проверки успешности открытия файла (нужно проверить, что в переменной file, смотрите пример из справки).
  2. Для успешного открытия файлов, кроме FILE_READ и FILE_WRITE, нужно добавлять флаги FILE_SHARE_WRITE и FILE_SHARE_READ.

FILE_SHARE_WRITE и FILE_SHARE_READ эти атрибуты нужны для совместного доступа к файлу, на сколько я понимаю пока речи об этом у автора не было. :) это будет следующая тема в топика от автора.

 

На счет FILE_COMMON , это означает:

FILE_COMMON

4096

Расположение файла в общей папке всех клиентских терминалов \Terminal\Common\Files. Флаг используется при открытии файлов (FileOpen()), копировании файлов (FileCopy(), FileMove()) и проверке существования файлов (FileIsExist())


А следовательно, ваш файлик должен лежать в папке "Common\Files".

 

Мой файл находится в папке COMMON. Я приложил файл. Это байтовый файл. Я создаю с использованием Python. Тогда прочитайте это через MQL5.

 with open (  "testme.bin"  ,  "wb"  )  as  f:  
    f.write (b  "1"  )  
    f.write (b  "2"  )  
    f.write (b  "3"  )  
    f.write (b  "4"  )  
    f.write (b  "5"  ) 

Таким образом создается файл BIN.

 
Farkhat Guzairov:

FILE_SHARE_WRITE и FILE_SHARE_READ эти атрибуты нужны для совместного доступа к файлу, на сколько я понимаю пока речи об этом у автора не было. :) это будет следующая тема в топика от автора.

У меня без этих флагов никогда ничего не читается и не пишется, что в MQL4, что в MQL5. Получаю ошибку.

 
jaffer wilson:

Мой файл находится в папке COMMON. Я приложил файл. Это байтовый файл. Я создаю с использованием Python. Тогда прочитайте это через MQL5.

Таким образом создается файл BIN.

К сообщению прикрепил файл, в котором сохранен следующая информация формате FILE_BIN :  0,1,2,3,4,5

Откройте его в любом редакторе и откройте свой файл, что вы увидите? Если в вашем файле вы увидите текст типа 0,1,2,3,4,5, то конечно же он будет не корректно читаться функцией FileReadArray

Файлы:
test_bin.txt  1 kb
 
Ihor Herasko:

У меня без этих флагов никогда ничего не читается и не пишется, что в MQL4, что в MQL5. Получаю ошибку.

Я не знаю, почему у вас так, вот пример у меня он отработал нормально без атрибутов FILE_SHARE_WRITE и FILE_SHARE_READ.

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
//--- откроем файл 
   string path = "test_bin.bin";
   int arr[5] = {0,1,2,3,4,5};
   //int arr = 0;
   ResetLastError(); 
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN); 
   if(handle!=INVALID_HANDLE) 
     { 
      //--- запишем данные массива в конец файла 
      FileSeek(handle,0,SEEK_END); 
      FileWriteArray(handle,arr,0,ArraySize(arr)); 
      //--- закрываем файл 
      FileClose(handle); 
     } 
   else 
      Print("Failed to open the file, error ",GetLastError()); 
  }
//+------------------------------------------------------------------+
Быть может у вас отсутствовал атрибут FILE_READ
 
jaffer wilson:

Мой файл находится в папке COMMON. Я приложил файл. Это байтовый файл. Я создаю с использованием Python. Тогда прочитайте это через MQL5.

Таким образом создается файл BIN.

Вполне возможно, f.write (b "1" ) никак не может быть равнозначен  FileWriteArray(handle,arr,0,1)

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