Запись в файл.

 
Как записать в файл но при этом не пересоздавать его ? Какие флаги нужно для этого поставить, подскажите плиз. Я пишу в файл используя флаги FILE_CSV|FILE_ANSI|FILE_COMMON (https://www.mql5.com/ru/docs/constants/io_constants/fileflags) но файл при открытии пересоздается и все записанные денные теряются... Как сделать так что бы он просто открывался и строки добавлялись ?
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы ввода/вывода / Флаги открытия файлов
  • www.mql5.com
Файл открывается для чтения. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл открывается для записи. Флаг используется при открытии файлов (FileOpen()). При открытии файла обязательно должен быть указан флаг FILE_WRITE и/или флаг FILE_READ Файл...
 
AndreyKrivcov:
Как записать в файл но при этом не пересоздавать его ? Какие флаги нужно для этого поставить, подскажите плиз. Я пишу в файл используя флаги FILE_CSV|FILE_ANSI|FILE_COMMON (https://www.mql5.com/ru/docs/constants/io_constants/fileflags) но файл при открытии пересоздается и все записанные денные теряются... Как сделать так что бы он просто открывался и строки добавлялись ?
https://www.mql5.com/ru/docs/files/fileseek      Вам в помощь
Документация по MQL5: Файловые операции / FileSeek
Документация по MQL5: Файловые операции / FileSeek
  • www.mql5.com
//|                                                Demo_FileSeek.mq5 | //|                        Copyright 2013, MetaQuotes Software Corp. | //|                                              https://www.mql5.com | //| Script program start function                                    |...
 
Alekseu Fedotov:
https://www.mql5.com/ru/docs/files/fileseek      Вам в помощь
AndreyKrivcov:
Как записать в файл но при этом не пересоздавать его ? Какие флаги нужно для этого поставить, подскажите плиз. Я пишу в файл используя флаги FILE_CSV|FILE_ANSI|FILE_COMMON (https://www.mql5.com/ru/docs/constants/io_constants/fileflags) но файл при открытии пересоздается и все записанные денные теряются... Как сделать так что бы он просто открывался и строки добавлялись ?

Если разрешена запись, то она выполняется с текущей позиции в файле. Также, как и чтение. Чтобы писать или читать не с начала, а с нужного места, нужно задать ненулевую позицию в файле (смещение от начала в байтах).

Если нужно добавлять в конец файла, нужно перед записью переместить текущую позицию на конец файла. FileSeek(fi, 0, SEEK_END);

 

Вообще-то, просто. Выше написали как.

Но, в МТ всего один поток и эксперт-индикатор, если пишет в файл приостанавливается. Иногда это критично, иногда нет. Когда это критично - делаем ДЛЛ, организуем там отдельный поток для записи файла, и из МТ вызываем функцию ДЛЛ, в которую передаем строку(и) для записи. Функция создает поток для записи и завершает работу. Все, поток МТ свободен, дальше разберутся без него.)

 
Yuriy Asaulenko:

Вообще-то, просто. Выше написали как.

Но, в МТ всего один поток и эксперт-индикатор, если пишет в файл приостанавливается. Иногда это критично, иногда нет. Когда это критично - делаем ДЛЛ, организуем там отдельный поток для записи файла, и из МТ вызываем функцию ДЛЛ, в которую передаем строку(и) для записи. Функция создает поток для записи и завершает работу. Все, поток МТ свободен, дальше разберутся без него.)


Благодарю, но с dll не буду заморачиваться. Мне не нужно что бы несколько экспертов в один файл писали, достаточно будет просто добавления записей в файл, как выше написали. Я для логов делаю, на робота по логу будет довольно логично и правильно. Если все боты в один лог файл будут писать, тот это неразбериха какая то будет). 

 

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

Т.е. всегда  перед записью ставить следующее: FILE_CSV|FILE_ANSI|FILE_COMMON|FILE_READ|FILE_WRITE 
(Ну расширение, тип записи и папку конечно по усмотрению делать.)

 
AndreyKrivcov:

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

Использовать-не использовать - это дело хозяйское. Но отчего Вы считаете, что все должно (будет) писаться в один файл? Куда направите, туда и будет писаться, Хоть в 10 файлов.)
 
Yuriy Asaulenko:
Использовать-не использовать - это дело хозяйское. Но отчего Вы считаете, что все должно (будет) писаться в один файл? Куда направите, туда и будет писаться, Хоть в 10 файлов.)

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

 
AndreyKrivcov:

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

Да, я понял. Под С++ с этим (добавлением) вообще нет вопросов, а файлы под MQL я как-то забросил. Стоит один раз сделать ДЛЛ и отказаться уже невозможно, типа как от курения.))

А написал, м.б. кому пригодится.

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