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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Andrey Azatskiy
3671
Andrey Azatskiy  
Как записать в файл но при этом не пересоздавать его ? Какие флаги нужно для этого поставить, подскажите плиз. Я пишу в файл используя флаги 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 Файл...
Alekseu Fedotov
1479
Alekseu Fedotov  
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                                    |...
Vladimir
1191
Vladimir  
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
9360
Yuriy Asaulenko  

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

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

Andrey Azatskiy
3671
Andrey Azatskiy  
Yuriy Asaulenko:

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

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


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

Andrey Azatskiy
3671
Andrey Azatskiy  

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

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

Yuriy Asaulenko
9360
Yuriy Asaulenko  
AndreyKrivcov:

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

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

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

Yuriy Asaulenko
9360
Yuriy Asaulenko  
AndreyKrivcov:

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

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

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий