Почему не читает значения из CSV-файла? Удаляет этот файл или иероглифы показывает.

 
Есть такой код

#property strict


int Handle; 
string Str_DtTm;                    


void OnTick()
{  
Handle=FileOpen("1.csv",FILE_READ|FILE_CSV,";");
Str_DtTm =FileReadString(Handle);
Alert(Str_DtTm);
FileClose( Handle );
}


При запуске этого  советника, он почему-то удаляет файл "1.csv"



Когда же файл помещаю в общую папку для всех клиентских терминалов, и FileOpen() использую с ключом FILE_COMMON, то иероглифы  какие-то показывает.





Советник и csv-файл  прилагаю:


Файлы:
 

Справка:  комбинация флагов, определяющая режим работы с файлом

Есть некоторые особенности работы при указании флагов чтения и записи:

  • Если указан FILE_READ – делается попытка открытия уже существующего файла. Если файл не существует, то открыть файл не получится, новый файл не создается.
  • Если FILE_READ|FILE_WRITE – создаётся новый файл если файл с таким именем отсутствует.
  • Если FILE_WRITE –  файл создается заново с нулевым размером.


То есть если использовать флаг FILE_READ - файл уже должен существовать, в противном случае будет ошибка.

 
Vladimir Karputov:

Справка:  комбинация флагов, определяющая режим работы с файлом

Есть некоторые особенности работы при указании флагов чтения и записи:

  • Если указан FILE_READ – делается попытка открытия уже существующего файла. Если файл не существует, то открыть файл не получится, новый файл не создается.
  • Если FILE_READ|FILE_WRITE – создаётся новый файл если файл с таким именем отсутствует.
  • Если FILE_WRITE –  файл создается заново с нулевым размером.


То есть если использовать флаг FILE_READ - файл уже должен существовать, в противном случае будет ошибка.

так у меня же FILE_READ в коде и файл помещен в нужную папку.



вы пробовали с помощью советника считать этот файл?

 
Для начала файл 1.csv предоставьте ...
 
Vladimir Karputov:
Для начала файл 1.csv предоставьте ...

Во вложении, файл 1.zip.

 

Ловите и не забывайте про кодировки ...

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input bool InpFileCommon   = false;          // "true" - in common folder
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   int filehandle=-1;
   ResetLastError();
   if(InpFileCommon)
      filehandle=FileOpen("1.csv",FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON);
   else
      filehandle=FileOpen("1.csv",FILE_READ|FILE_ANSI|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      Print("Operation FileOpen OK");
      Print(FileReadString(filehandle));
      FileClose(filehandle);
     }
   else
      Print("Operation FileOpen ERROR# ",GetLastError());
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+


Можно тренироваться как с общей папкой так и с папкой по-умолчанию:

input bool InpFileCommon   = false;          // "true" - in common folder
 
Vladimir Karputov:

 не забывайте про кодировки ...

а есть какой-то способ чтобы проверить кодировку файла?

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

 
danminin:

Не работает.

Добавил 2 строчки

 int Dt =FileReadString(filehandle);

 Alert(Dt);


У меня всё работает, а вот Вы вставили свои строчки не подумав - в общем сделали ошибку.

Задание: подумать, КУДА нужно поставить Ваши две строки, чтобы попасть в цикл ФАЙЛ ОТКРЫТ -> ФАЙЛ ОТКРЫТ УСПЕШНО.

 
Vladimir Karputov:

У меня всё работает, а вот Вы вставили свои строчки не подумав - в общем сделали ошибку.

Задание: подумать, КУДА нужно поставить Ваши две строки, чтобы попасть в цикл ФАЙЛ ОТКРЫТ -> ФАЙЛ ОТКРЫТ УСПЕШНО.

Работает!

Кажись понял в чем дело. У меня не было флага FILE_ANSI.

просто в  mql4 и без этого флага работало, поэтому я его и не ставил...


//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                              Copyright © 2019, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2019, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.00"
//--- input parameters
input bool InpFileCommon   = true;          // "true" - in common folder
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   int filehandle=-1;
   ResetLastError();
   if(InpFileCommon)
      filehandle=FileOpen("1.csv",FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON);
   else
      filehandle=FileOpen("1.csv",FILE_READ|FILE_ANSI|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      Print("Operation FileOpen OK");
      
      
      string Dt =FileReadString(filehandle);
      Alert(Dt);
      
      
      FileClose(filehandle);
     }
   else
      Print("Operation FileOpen ERROR# ",GetLastError());
//---





   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
 

Но все же...

Вот есть у меня в папке файл 1.csv

Как его проверить, в какой он кодировке? ansi или unicode.

 
danminin:

Но все же...

Вот есть у меня в папке файл 1.csv

Как его проверить, в какой он кодировке? ansi или unicode.

Если .. в начале файла будет обнаружен специальный двухбайтовый признак 0xff,0xfe, то флаг кодировки будет FILE_UNICODE, даже если указан флаг FILE_ANSI.

Например при помощи скрипта я создал новый файл в формате Unicode

void OnStart()
  {
   int filehandle=FileOpen("2.csv",FILE_WRITE|FILE_CSV|FILE_UNICODE);
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,TimeCurrent(),Symbol(), EnumToString(_Period));
      FileClose(filehandle);
      Print("FileOpen OK");
     }
  }

и затем открыл файл в hex редакторе - вот в начале файла признак Unicode:

признак Unicode в начале файла

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