Как из конца файла удалить кусок данных. - страница 4

 
Renat Akhtyamov:

к оставшимся снизу строкам применить функцию

https://www.mql5.com/ru/docs/strings/stringtrimleft

Как Вы предлагаете её применить?

Начиная с позиции где мы стоим можно затереть всё это не сложно.

Renat Akhtyamov:

к оставшимся снизу строкам применить функцию

https://www.mql5.com/ru/docs/strings/stringtrimleft

затем почистить весь получившийся кусок текста и сохранить файл

то есть из нескольких строк сделать одну и поменять на пустую строку

не пробовал, но предполагаю что поможет

Немного в логику ни въехал этого мероприятия. Думаю можно за этот вариант зацепиться.

То есть вы предлагаете уничтожить несколько строк. Хорошо не вопрос. А дальше?

Мне кажется если поставить в этом месте конец файла то получится что нужно. Предложили средствами WinAPI. Но вот примера пока найти не могу.

 
Maxim Kuznetsov:

как вариант: можно сделать недо-базу :-) когда пишется громадный файл с большими записями (даже с переменным размером, например со строками, даже CSV) - пишите рядом индексный файл с фиксированными записями первичный_ключ:смещение:размер;

свечки очевидно и естественно сразу сортированы по времени, потому что они физически так поступают; процедура удаления любых/произвольных свечек будет выглядеть как обнуление поля "размер" в индексе.

если удаления часты, потребуется отдельная процедура squeeze - раз в неделю (например в ночь с сб на вск) перелопатить оба файла

PS/ в реальной жизни примерно так видео пишется во всяких DVR, рядом ведётся индексный файл по опорным кадрам. 

Максим, как искать нужную запись не вопрос. Это не сложно. Вопрос как из файла истории котировок, который отображается в открытом окне удалить данные о свечке. Если проще описать задачу, то нужно не переписывая файл удалить n*48 байт начиная с конца. Как это сделать? Файл открыт средствами MQL. 

 

По ходу осилил написать

#import "kernel32.dll"
bool SetEndOfFile(
   int hFile   // дескриптор файла
);
#import

Но надо ещё какими-то функциями открывать файл и устанавливать в нужную позицию.

 
ROMAN KIVERIN:

Максим, как искать нужную запись не вопрос. Это не сложно. Вопрос как из файла истории котировок, который отображается в открытом окне удалить данные о свечке. Если проще описать задачу, то нужно не переписывая файл удалить n*48 байт начиная с конца. Как это сделать? Файл открыт средствами MQL. 

и при этом чтобы терминал это правильно понял и скорректировал отображение истории :-) с этого надо было начинать. В результате все предыдущие 4 страницы обсуждений посвящены несколько иному

 
Maxim Kuznetsov:

и при этом чтобы терминал это правильно понял и скорректировал отображение истории :-) с этого надо было начинать. В результате все предыдущие 4 страницы обсуждений посвящены несколько иному

Терминал пока всё понимает и хорошо прорисовывает. Вопросов с этим совсем нет. Вопросы в файловых функциях. После того как файл корректируется графики обновляются. Вперёд рисуется прекрасно, нужно чтобы рисовалось назад во времени.

 

Походу в одном из примеров нашёл импорт функций.

#import "kernel32.dll"
int   CloseHandle(int hObject);
int   CreateFileW(string lpFileName,
                  int dwDesiredAccess,
                  int dwShareMode,
                  int lpSecurityAttributes,
                  int dwCreationDisposition,
                  int dwFlagsAndAttributes,
                  int hTemplateFile
                 );
int   SetFilePointer(int hFile, int lDistanceToMove, int& lpDistanceToMoveHigh[], int dwMoveMethod);
int   SetEndOfFile(int hFile);
int   ReadFile(int hFile, ushort& lpBuffer[], int nNumberOfBytesToRead, int& lpNumberOfBytesRead[], int lpOverlapped);
int   WriteFile(int  hFile, int& lpBuffer[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten[], int lpOverlapped);
int   GetFileSize(int hFile,  int notUsed = 0);
int   FindClose(int handle);
#import

Кто работал с этими функциями? Кто может написать как можно открыть файл, установить указатель в нужную позицию?

Всего две строчки. Кто может написать? Никогда не работал с этими функциями, не знаю как делать.

 
Документация по MQL5: Файловые операции / FileOpen
Документация по MQL5: Файловые операции / FileOpen
  • www.mql5.com
[in]  Имя открываемого файла, может содержать подпапки. Если файл открывается для записи, то указанные подпапки будут созданы в случае их отсутствия. [in]  значение, используемое в качестве разделителя в txt или csv-файле. Если для csv-файла разделитель не указан, то по умолчанию используется символ табуляции. Если для txt-файла разделитель не...
 
ROMAN KIVERIN:

По ходу осилил написать

Но надо ещё какими-то функциями открывать файл и устанавливать в нужную позицию.

Я Вам дал ссылку на официальные доки от micrisoft, там есть все, что нужно, для работы с файлами. Если Вам азы нужны, то начните с функции CreateFile. Поспрашивайте, может кто подскажет какие путные русскоязычные ресурсы по тематике, я в основном, как-то по официальным докам разбирался в свое время. Как вариант, посмотри тут http://vsokovikov.narod.ru/New_MSDN_API/Menage_files/fn_createfile.htm не знаю поможет или нет, все таки там тоже справочник, а не учебник.

Функция CreateFile
  • vsokovikov.narod.ru
Флажок Предназначение Предписывает системе не записывать через посредство какого-либо промежуточного кэша, а перейти непосредственно на диск.  Если флажок FILE_FLAG_NO_BUFFERING также не определен, так, чтобы кэширование системы было в действительности, то данные записываются в системном КЭШе, но сбрасываются на диск без задержки. Если к...
 
ROMAN KIVERIN:

Походу в одном из примеров нашёл импорт функций.

Кто работал с этими функциями? Кто может написать как можно открыть файл, установить указатель в нужную позицию?

Всего две строчки. Кто может написать? Никогда не работал с этими функциями, не знаю как делать.

Средствами MQL (https://www.mql5.com/ru/docs/files/fileseek, https://stackoverflow.com/a/57284988, https://www.mql5.com/en/forum/99755#comment_2949328):

int fh = FileOpen("test.txt", FILE_READ|FILE_WRITE|FILE_ANSI|FILE_TXT);
// FileSeek(fh, 0, SEEK_END); - курсор в конец файла
// FileSeek(fh, -nBytes, SEEK_END); - курсор c отступом nBytes от конца файла
// FileSeek(fh, nBytes, SEEK_SET); - курсор в позицию c отступом nBytes от начала файла
...
FileWrite(fh, "Additional line");
FileClose(fh);

Средствами WinAPI:
См. функции из https://gist.github.com/currencysecrets/11353588

 
ROMAN KIVERIN:

Походу в одном из примеров нашёл импорт функций.

Кто работал с этими функциями? Кто может написать как можно открыть файл, установить указатель в нужную позицию?

Всего две строчки. Кто может написать? Никогда не работал с этими функциями, не знаю как делать.

Начнем с того, что тут типы неправильные. Разберем на примере CreateFile. Ниже сигнатуры из Вашего примера и оригинальная.


int   CreateFileW(string lpFileName,
                  int dwDesiredAccess,
                  int dwShareMode,
                  int lpSecurityAttributes,
                  int dwCreationDisposition,
                  int dwFlagsAndAttributes,
                  int hTemplateFile
                 );

HANDLE CreateFile(
  LPCTSTR  lpFileName,                         // имя файла
  DWORD  dwDesiredAccess,                      // режим доступа
  DWORD  dwShareMode,                          // совместный доступ
  LPSECURITY_ATTRIBUTES  lpSecurityAttributes, // SD (дескр. защиты)
  DWORD  dwCreationDisposition,                // как действовать
  DWORD  dwFlagsAndAttributes,                 // атрибуты файла
  HANDLE  hTemplateFile                        // дескр.шаблона файла
);

С именем файла все норм.

DWORD - это:

typedef unsigned long DWORD;

на местном - это uint

А вот теперь HANDLE:

typedef void *HANDLE;

вот так он определен. Упс, указатель. Для 64-битной архитектуры int - это как то маловато.

Аналогично и LPSECURITY_ATTRIBUTES 

typedef struct _SECURITY_ATTRIBUTES {
    DWORD nLength;
    LPVOID lpSecurityDescriptor;
    BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

тоже указатель.

Так-то да, для mql4, в целом пойдет, но все же лучше определить правильно:

#define DWORD uint
#ifdef __MQL5__
   #define HANDLE long
   #define LPSECURITY_ATTRIBUTES long
#else
   #define HANDLE int
   #define LPSECURITY_ATTRIBUTES int   
#endif

А вот если SECURITY_ATTRIBUTES захочешь пользоваться, то тут уже простым переносом не получится, там танцы с бубном устраивать нужно. В общем, тема интересная.

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