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

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

Здравствуйте. Есть советник, записывающий тики. Возможно ли ввести ограничение на количество строк в текстовом файле. Например. При достижении 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), "."), ',');
}
Dmitry Fedoseev
57632
Dmitry Fedoseev  
С файлом такие манипуляции невозможно делать. Но можно сначала прочитать файл в массив и добавлять новые данные в него, как угодно, и сохранять этот массив.
Igor Makanu
9909
Igor Makanu  

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

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

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

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

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

Ihor Herasko
21844
Ihor Herasko  

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

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

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

Aliaksandr Hryshyn
2890
Aliaksandr Hryshyn  
Dmitry Fedoseev:

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

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



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