Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Не знаете MQL5, но хорошо продаете? Партнерская программа для вас!
МихалbIч
57
МихалbIч 2007.03.29 18:45 
Функция FileSeek с параметром SEEK_END возвращает файловый указатель на заданное количество байт.
Нужна функция возвращающая файловый указатель на заданное количество строк.
Заранее спасибо.
Igor Kim
2759
Igor Kim 2007.03.29 18:53  
Читайте строку нужное количество раз функцией FileReadString. И не забывайте о максимальном размере строки. 255 символов.
МихалbIч
57
МихалbIч 2007.03.29 19:29  
Да, с функцией FileReadString я знаком. Если я правильно понимаю, эта функция читает текущую строку с текущей позиции файлового указателя, а затем перемещает файловый указатель в начало следующей строки.
Или можно сделать, чтобы файловый указатель перемещался в начало предыдущей строки?
Rashid Umarov
Админ
6602
Rashid Umarov 2007.03.29 19:44  
Завтра я выложу функцию, которая решает эту проблему окончательно.
Rashid Umarov
Админ
6602
Rashid Umarov 2007.03.30 08:28  
Вот обещанная функция.

//+------------------------------------------------------------------+
//| запись содержимого файла в массив строк array[]                  |
//| в случае неудачи вернем false                                    |
//+------------------------------------------------------------------+
bool ReadFileToArray(string &array[],string FileName)
  {
   bool res=false;
   int FileHandle;
   string tempArray[64000],currString;
   int stringCounter;
   int devider='\x90';
//----
   FileHandle=FileOpen(FileName,FILE_READ,devider);
   if (FileHandle!=-1)
      {
      while(!FileIsEnding(FileHandle)) 
         {
         currString=FileReadString(FileHandle);
         tempArray[stringCounter]=currString;
         stringCounter++;
         }
      if (stringCounter>0) 
         {
         ArrayResize(array,stringCounter);
         for (int i=0;i<stringCounter;i++) array[i]=tempArray[i];
         res=true;
         }
      }
//----
   return(res);
  }

Она принимает массив array по ссылке и имя файла. В результате будет сформирован массив , содержащий строки текстового файла. В качестве разделителя выбран экзотический спецсимвол
'\x90';
, но не могу дать гарантии, что такой символ никогда не встретится в каком-нибудь текстовом файле.
Пример вызова:

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
  {
//----
   string InitialStringArray[];   // сюда считаем файл
//----
   if (!ReadFileToArray(InitialStringArray,FileName)) 
      {
      Alert("Данных для обработки  нет");
      return;
      }
   return(0);
  }
//+------------------------------------------------------------------+
МихалbIч
57
МихалbIч 2007.04.01 22:04  

Отличная работа. Не прошло и суток ;-).
В массиве можно гонять строки, как вперёд, так и назад.
С разделителями у меня проблем не возникнет (формат типа Excel).
Для меня единственный недостаток в том, что файл, всё же, придётся читать полностью (файл не маленький, занимает время). Было бы более приемлемо читать файл от конца. В моём случае нужные данные находятся в последних строках.
Ну, как говорится: "На безрыбье и рак - рыба".
Ещё раз, спасибо.

Владимир Тезис
4270
Владимир Тезис 2012.06.21 00:39  
Rosh:
Вот обещанная функция.


Не врубился в одну весчь. Функция FileOpen() в подпрограмме есть, а функции FileClose() нету. Я что-то упустил и она тут не нужна, или Вы просто забыли её сюда поставить?
Alexey Subbotin
4999
Alexey Subbotin 2012.06.21 07:07  
Конечно нужна) перед return
Владимир Тезис
4270
Владимир Тезис 2012.06.21 08:19  
alsu:
Конечно нужна) перед return


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

Пол-года назад тут парень обращался с проблемой - у него в коде открывалось на каждом тике по копии одного и того же файла. Затем достигался предел и код выдадвал ошибку. Теперь понятно откуда берутся такого типа промахи - видать он просто этот участок кода откуда-то срисовал.

Rosh, исправьте пожалуйста (а то опять может кто-то напутать код, а потом недоумевать, почему он не работает).

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