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

 

Есть открытый файл.

Как удалить кусок данных с конца файла

   int rhandle=FileOpenHistory(Symb+IntegerToString(frame)+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_READ|FILE_ANSI);

   if(rhandle < 0)
      return (-1);

   int voidA[15];
   FileWriteInteger(rhandle,400,LONG_VALUE);
   FileWriteString(rhandle,"(C)opyright 2019, Roman",64);
   FileWriteString(rhandle,Symb,12);
   FileWriteInteger(rhandle,frame,LONG_VALUE);
   FileWriteInteger(rhandle,Digits,LONG_VALUE);
   FileWriteArray(rhandle,voidA,0,15);
   FileFlush(rhandle);
   return rhandle;

Вот открыли файл 

      FileWriteInteger(handle,(int)New.Time,LONG_VALUE);
      FileWriteDouble(handle,NormalizeDouble(New.Open,_Digits),DOUBLE_VALUE);
      FileWriteDouble(handle,NormalizeDouble(New.High,_Digits),DOUBLE_VALUE);
      FileWriteDouble(handle,NormalizeDouble(New.Low,_Digits),DOUBLE_VALUE);
      FileWriteDouble(handle,NormalizeDouble(New.Close,_Digits),DOUBLE_VALUE);
      FileWriteDouble(handle,New.Volume,DOUBLE_VALUE);
      FileFlush(handle);

Засунули туда 20 свечек. Поняли что 10 лишних. Как их удалить из этого же файла?

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

Есть открытый файл.

Как удалить кусок данных с конца файла

Вот открыли файл 

Засунули туда 20 свечек. Поняли что 10 лишних. Как их удалить из этого же файла?

Если чисто на mql, то: создается временный файл -> в него копируется все, что нужно -> рабочий файл удаляется -> временный переименовывается в рабочий.

Ну,а если хотите красиво, то WinAPI в помощь.

 
ROMAN KIVERIN:

Есть открытый файл.

Как удалить кусок данных с конца файла

Вот открыли файл 

Засунули туда 20 свечек. Поняли что 10 лишних. Как их удалить из этого же файла?

ИМХО, такой путь - потенциальный танец на граблях. Лучше пересоздать файл с актуальными данными. Либо работать с бинарным файлом с жёсткой структурой.

 
Vladimir Simakov:

Если чисто на mql, то: создается временный файл -> в него копируется все, что нужно -> рабочий файл удаляется -> временный переименовывается в рабочий.

Ну,а если хотите красиво, то WinAPI в помощь.

И какую же такую красоту даст Win API?

 
ROMAN KIVERIN:

...

Засунули туда 20 свечек. Поняли что 10 лишних. Как их удалить из этого же файла?

Никак, только перезаписывать весь файл.

 

Вы там переотдыхали что-ли ?

FileSeek - сдвинуть позицию. Просто передвинуть на размер "ненужных свечек", и всё. 

 
Dmitry Fedoseev:

И какую же такую красоту даст Win API?

SetFilePointer(handle, pointerWhatYouWant, &temp, FILE_BEGIN);
SetEndOfFile(handle);
SetFileValidData(handle, pointerWhatYouWant);
 
Maxim Kuznetsov:

Вы там переотдыхали что-ли ?

FileSeek - сдвинуть позицию. Просто передвинуть на размер "ненужных свечек", и всё. 

Так ему не затереть, а удалить надо.
 
Vladimir Simakov:
Так ему не затереть, а удалить надо.

Не вижу разницы. 

Исходная задача - написано N+K свечек, K последних оказались лишними. 

Решение - переместить указатель на K*размер_структуры_свечи от конца файла. 

Если будете записывать дальше, то лишние свечки перезатрутся; если закроете сразу, то удалятся (файл обрежется по позиции). 

нюанс - могут пляски/гонки c SHARE_READ если кто-то открыл файл на чтение. 

 
Maxim Kuznetsov:

Не вижу разницы. 

Исходная задача - написано N+K свечек, K последних оказались лишними. 

Решение - переместить указатель на K*размер_структуры_свечи от конца файла. 

Если будете записывать дальше, то лишние свечки перезатрутся; если закроете сразу, то удалятся (файл обрежется по позиции). 

нюанс - могут пляски/гонки c SHARE_READ если кто-то открыл файл на чтение. 

  1. Не удалятся.
  2. А использование SHARE_READ|SHARE_WRITE, без наличия LockFile... Без меня.
 
Maxim Kuznetsov:

Не вижу разницы. 

Исходная задача - написано N+K свечек, K последних оказались лишними. 

Решение - переместить указатель на K*размер_структуры_свечи от конца файла. 

Если будете записывать дальше, то лишние свечки перезатрутся; если закроете сразу, то удалятся (файл обрежется по позиции). 

нюанс - могут пляски/гонки c SHARE_READ если кто-то открыл файл на чтение. 

Очень здорово. Большое спасибо. Если мы закроем файл Вы точно знаете что файл закроется именно в том месте где стоит указатель. В моём случае нужно будет опять переоткрывать. Файл читается и выводится терминалом, а данные из файла терминал выводит в виде свечек.