Работа с файлами в MQL4

 

Добрый вечер

Можете привести кусок кода с примером, чтобы он делал элементарную вещь:

открывал excel файл для дозаписи в новую строку нового значения (т.е. чтобы он не затирал уже записанные строки, а дозаписывал их в конец)


не могу найти пример конкретно с дозаписью в конец файла 

спасибо 

 
ramnek: пример конкретно с дозаписью в конец файла 
  // Открытие или создание файла и перемещение указателя в конец
   int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " ");
   FileSeek(Файл, 0, SEEK_END);

   // Если новый файл записать строку заголовков колонок
   if(FileSize(Файл)==0)FileWrite(Файл,
"  Дата     Время      Баланс    Средства      Залог    Свободно     Уровень      Прибыль");

   // Сбор информации и запись в файл
   string Текст=TimeToStr(TimeCurrent());                // Дата и Время
   string Строка=DoubleToStr(AccountBalance(),2);        // Баланс = Оприходованные средства
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity(),2);         // Средства = Баланс + Прибыль
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountMargin(),2);         // Залог
   while(StringLen(Строка)<11)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity()-AccountMargin(),2); // Свободно= Средства - Залог
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountEquity()/AccountMargin()*100,2)+"%"; // Уровень=Средства/Залог
   while(StringLen(Строка)<12)Строка=" "+Строка;  Текст=Текст+Строка;
   Строка=DoubleToStr(AccountProfit(),2);         // Прибыль 
   while(StringLen(Строка)<13)Строка=" "+Строка;  Текст=Текст+Строка;

   FileWrite(Файл, Текст);   // Запись в файл сформированной текстовой строки
   FileClose(Файл);          // Закрыть файл
   Файл = 0;                 // Заметая следы обнулим указатель
}
Только Excel в отличие от текстового файла является книгой, с особой внутренней организацией. Нужно делать импорт текстового файла
 
LRA, спасибо большое
 

только не помогло.. 

FileSeek(Файл, 0, SEEK_END);

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

 
ramnek:

только не помогло.. 

FileSeek(Файл, 0, SEEK_END);

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

Откройте совместный доступ для чтения при создании файла. Файл лучше создать в OnInit(). Потом, не закрывая файл, пишите в него. Будет дописываться в конец.

В EXCEL настройте импорт файла и включите автообновление с интервалом в 1 минуту. Если нужно чаще, то можно вывести значок обновления на панель меню и кликать по нему мышкой. Я делаю и то, и другое.

  // Создание файла
   int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_SHARE_READ | FILE_WRITE, ";");
 
ramnek:   FileSeek(Файл, 0, SEEK_END); как будто ничего не делает.. файл при записи пишет с самого начала и затирает все, что было до

Понял, в чем дело. Обязательно нужна опция FILE_READ. Без нее файл создается заново и все бывшее ранее пропадает.

int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " ");

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

 
LRA:

Понял, в чем дело. Обязательно нужна опция FILE_READ. Без нее файл создается заново и все бывшее ранее пропадает.

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


Вместо FILE_READ поставьте FILE_SHARE_READ и файл можно не закрывать. Другие будут спокойно его читать. Но, эти другие должны озаботиться обновлением. Вот они и должны закрывать и открывать файлы, чтобы увидеть обновления.

Иногда они будут нарываться на ошибки доступа к файлу. Но, по опыту, это происходит редко, если обновляться раз в несколько секунд. 

 
Mislaid:

Вместо FILE_READ поставьте FILE_SHARE_READ и файл можно не закрывать. Другие будут спокойно его читать. Но, эти другие должны озаботиться обновлением. Вот они и должны закрывать и открывать файлы, чтобы увидеть обновления.

Иногда они будут нарываться на ошибки доступа к файлу. Но, по опыту, это происходит редко, если обновляться раз в несколько секунд. 

Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.
 
LRA:
Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.
Можно после обновления файла принудительно сбросить данные на диск, но это не выход из положения. Если файл не закрывать, то он не увидит изменения сделанные кем-то другим и тогда FILE_SHARE_READ не поможет.
 
LRA:
Открытый файл невозможно прочесть Блокнотом Windows, Notepad++ и другими программами - или он кажется пустым, или в нем отсутствуют последние записи. Когда же файл открывается перед записью и закрывается сразу после - он спокойно читается всеми программами.

Странно. У меня все читается.

Действительно, его невозможно открыть сторонними приложениями, если при открытии не указать  FILE_SHARE_READ