Ограничение числа записываемых строк

 

Здравствуйте. Есть советник, записывающий тики. Возможно ли ввести ограничение на количество строк в текстовом файле. Например. При достижении 20000 строк (тиков), первые 5000 строк удаляются и продолжается запись до 20000 (т.е. с 15 до 20).

//+------------------------------------------------------------------+
//| Запись в файл Ask & Bid                                          |
//|                                                                  |
//+------------------------------------------------------------------+
#property strict

enum Локаль   // Десятичный разделитель для отображения в Excel
{
  Точка,
  Запятая
};
extern Локаль   RUS = Запятая; // Для русской локализации запятую
string ИмяФайла;          // Имя файла на диске
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnInit()
{
  ИмяФайла=Symbol()+".txt";
}
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTick()
{
   string Текст, Строка;

   // Открытие или создание файла и перемещение указателя в конец
   int Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " ");
   if(Файл == -1)
   {
      Alert("Ошибка при открытии файла ", ИмяФайла);
      return;
   }
   FileSeek(Файл, 0, SEEK_END);

   // Если новый файл записать строку заголовков колонок
   if(FileSize(Файл)==0)FileWrite(Файл, "           Время     BID");

   // Сбор информации и запись в файл
   FileWrite(Файл,
             TimeToStr(Time[0]),
             dstr(Bid) );
   FileClose(Файл);
   Файл = 0;                 // Заметая следы обнулим указатель
}
// Преобразование числа double в строку с запятой или точкой в соответствии с локализацией
string dstr(double Цена)
{
  if(!RUS) return DoubleToStr(Цена, Digits);
  return StringSetChar(DoubleToStr(Цена, Digits), StringFind(DoubleToStr(Цена, Digits), "."), ',');
}
 
С файлом такие манипуляции невозможно делать. Но можно сначала прочитать файл в массив и добавлять новые данные в него, как угодно, и сохранять этот массив.
 

MQL работает как все программы с файлами - открыл файл --> записал данные --> переместился файловый указатель автоматически --> записал данные --> переместился файловый указатель автоматически .... закрыл файл

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

поэтому нужно или удалять весь файл и записывать с начала все данные

или делать некую циклическую запись - достигнув конца файла перемещать указатель на начало, но это явно не Ваш вариант

или, по мне так для Вашей задачи оптимальнее - пишите в 2-3 файла по очереди, т.е заполнили файл №1 , закрыли его, пишите в файл №2, затем №3 - но удалите файл №1 

 

Самый простой вариант:

  1. Прочитать файл в массив.
  2. Обработать массив (добавить, изменить, удалить элементы).
  3. Записать содержимое массива в файл (полная перезапись файла).
Запись файла осуществлять только по мере необходимости: закрытие программы или срабатывание автосохранения.
 
Всем спасибо.
 
Oleg Bondarev:
Всем спасибо.
Можно по кругу писать в файл. Дошли до 20000, потом записываем сначала файла, в самом начале можно сохранять место записи.
Только строк может быть переменное количество, тогда при первом сохранении можно больше строк писать, например 25000, ну чтобы гарантированно было 20000.
 
Aliaksandr Hryshyn:
Можно по кругу писать в файл. Дошли до 20000, потом записываем сначала файла, в самом начале можно сохранять место записи.
Только строк может быть переменное количество, тогда при первом сохранении можно больше строк писать, например 25000, ну чтобы гарантированно было 20000.

А если новая запись короче?

 
Dmitry Fedoseev:

А если новая запись короче?

Значит будет больше строк :) .
Можно ещё для одной строки выделять фиксированное количество символов, тогда всё ровно можно сделать, и поиск нужной строки не вызовет трудностей.



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