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

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

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

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

 
Rosh:
Вот обещанная функция.


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


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

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

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

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