Поставить указатель на начало последней строки в .csv файле

 

Всем привет!

Ребята, как поставить указатель FileSeek на начало предпоследней и последней строки в файле?

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

Буду очень признателен за любую помощь. Спасибо.

 

Поставить указатель в конец, получить его значение, вычесть из него 1, установить указатель на вычисленную позицию, считать один символ, и т.д. пока не будет прочитан символ \r или \n, или позиция указателя не станет 0.

А прям такие мегагромадные файлы, что просто прочитать его весь построчно нельзя? 

 

 Только перебором и счетом строк - https://www.mql5.com/ru/docs/files/filereadstring  Это сейчас вам нужна предпоследняя, потом и другие понадобятся.))

Хотите непосредственно заданную строку - SQLite вам в помощь. В ДЛЛ всего-то 5 необходимых функций для всего. Остальные  на любителя.)

Документация по MQL5: Файловые операции / FileReadString
Документация по MQL5: Файловые операции / FileReadString
  • www.mql5.com
При чтении из bin-файла обязательно указывать длину читаемой строки. При чтении из txt-файла длину строки указывать не надо, будет прочитана строка от текущего положения до признака перевода строки "\r\n". При чтении из csv-файла длину строки также указывать не надо, будет прочитана строка от текущего положения до ближайшего разделителя либо до...
 
Dmitry Fedoseev:

Поставить указатель в конец, получить его значение, вычесть из него 1, установить указатель на вычисленную позицию, считать один символ, и т.д. пока не будет прочитан символ \r или \n, или позиция указателя не станет 0.

А прям такие мегагромадные файлы, что просто прочитать его весь построчно нельзя? 

Это он такой после 5 секундного прогона. Он будет большой в боевых условиях.

Благодарю за ответ, милейший.

 
Evgeniy Zhdan:

Это он такой после 5 секундного прогона. Он будет большой в боевых условиях.

Благодарю за ответ, милейший.

Вы этот указатель никогда на последнюю строку не поставите, т.к. пока вы соберетесь туда его ставить, еще неск строк добавятся.) А когда начнете читать, то строка, может случиться, будет уже далеко не последней.

 
Yuriy Asaulenko:

 Только перебором и счетом строк - https://www.mql5.com/ru/docs/files/filereadstring  Это сейчас вам нужна предпоследняя, потом и другие понадобятся.))

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

 
Yuriy Asaulenko:

Вы этот указатель никогда на последнюю строку не поставите, т.к. пока вы соберетесь туда его ставить, еще неск строк добавятся.) А когда начнете читать, то строка, может случиться, будет уже далеко не последней.

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

 
Evgeniy Zhdan:

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

Я про считать байты с конца ничего не говорил.)

 
Evgeniy Zhdan:

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

Но конфликт вполне реален. Если 40 записей за 5 с.

Удалил часть текста. Подумал, что надо иметь более подробную инфу о задаче. Скажем, в рамках одно программы MQL описанная ТС конструкция выглядит совершенно бессмысленной.

 
Evgeniy Zhdan:

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

Объявляем 2 строковые переменные S и SPred (раз Вам надо последнюю и предпоследнюю - две). Полагаем S="". Читаем файл с его начала построчно в S до конца файла. Перед каждым чтением заносим содержимое S в SPred. Когда чтение закончится, в SPred будет находиться предпоследняя, в S последняя строка. Возможно, надо отдельно обслужить случаи, когда всего строк было меньше 2 и меньше одной.

Или Вам требуются не сами строки, а смещения их начала в файле?

 

Может быть уже исправили, но не так давно я экспериментировал с перемещением указателя.

Получается такая фигня: в файлах .txt и .csv какие-то сбои шли и не получалось зная количество байт записи в строке переместить указатель куда надо. НО!!! в файле .bin всё чётко считается и указатель перемещается куда душе угодно.

Поэкспериментируйте сейчас как будет получаться. Считаем количество байт согласно документации, int 4 байта, double 8 байт если правильно помню и так далее... И от конца файла перемещать указатель на МИНУС байт...

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