Скачать MetaTrader 5

Возвращение файлового указателя.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
МихалbIч
57
МихалbIч  
Функция FileSeek с параметром SEEK_END возвращает файловый указатель на заданное количество байт.
Нужна функция возвращающая файловый указатель на заданное количество строк.
Заранее спасибо.
Igor Kim
2739
Igor Kim  
Читайте строку нужное количество раз функцией FileReadString. И не забывайте о максимальном размере строки. 255 символов.
МихалbIч
57
МихалbIч  
Да, с функцией FileReadString я знаком. Если я правильно понимаю, эта функция читает текущую строку с текущей позиции файлового указателя, а затем перемещает файловый указатель в начало следующей строки.
Или можно сделать, чтобы файловый указатель перемещался в начало предыдущей строки?
Rashid Umarov
Админ
12320
Rashid Umarov  
Завтра я выложу функцию, которая решает эту проблему окончательно.
Rashid Umarov
Админ
12320
Rashid Umarov  
Вот обещанная функция.

//+------------------------------------------------------------------+
//| запись содержимого файла в массив строк 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ч  

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

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


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


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

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

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

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