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

 

как бы я делал...

Поставил бы указатель в конец файла. Дальше нашел бы конец предыдущей строки. (2-ой) Это либо /n ли,о /r либо = 0 (кажеться так? )  нашел бы конец строки 3 -ой с конца и сдвинул бы на указатель на 1 символ вперед. ВСе ! 

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

У клиента есть индикатор и советник. Индикатор печатает свой файл построчно. Советник печатает тоже какую-то белиберду в свой файл после каждой сделки построчно. Т.е. имеем 2 файла .csv.

Задача: После того как советник открыл сделку и записал свои данные в СВОЙ файл, надо прочитать последние 2 строки из файла индикатора и эти данные снова дописать в файл советника напротив своих данных. Вот так вот. Кому-то бессмысленно, кому-то нет.

 
Dmitiry Ananiev:

как бы я делал...

Поставил бы указатель в конец файла. Дальше нашел бы конец предыдущей строки. (2-ой) Это либо /n ли,о /r либо = 0 (кажеться так? )  нашел бы конец строки 3 -ой с конца и сдвинул бы на указатель на 1 символ вперед. ВСе ! 

Я решил упростить задачу. Сейчас в индкатор добавил код, который печатает отдельный файл с нужными мне значениями в нужном мне порядке. Вот и все!

А то уже голова кругом от этих байтов-шмайтов.

 
Evgeniy Zhdan:

У клиента есть индикатор и советник. Индикатор печатает свой файл построчно. Советник печатает тоже какую-то белиберду в свой файл после каждой сделки построчно. Т.е. имеем 2 файла .csv.

Задача: После того как советник открыл сделку и записал свои данные в СВОЙ файл, надо прочитать последние 2 строки из файла индикатора и эти данные снова дописать в файл советника напротив своих данных. Вот так вот. Кому-то бессмысленно, кому-то нет.

А индикатор вообще не общается с советником? Только через файлы?

А если общается, так советник и так все реал-тайм знает, он же не от фонаря сделки лепит, чего ему в файлы индикатора лезть? - пиши себе в файл данные индикатора.

 
Yuriy Asaulenko:

А индикатор вообще не общается с советником? Только через файлы?

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

Общается файлами. 1500 строк кода в советнике. Желания разгребать чужой код не имеется. Ищем легкие пути)

 
Evgeniy Zhdan:

Общается файлами. 1500 строк кода в советнике. Желания разгребать чужой код не имеется. Ищем легкие пути)

))

Вообще, по хорошему, задачка явно для SQL БД. Я в свое время так и делал - все данные асинхронно сваливал в таблицы, а прога уже оттуда их читала. Не уговариваю, явно не тот случай.)

 
Vladimir:

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

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

А вот это уже интересно! Спасибо за наводку
 
Evgeniy Zhdan:
А вот это уже интересно! Спасибо за наводку
Дык, если весь файл с начала читать, эт очевидно. И так каждый раз. А если большой? )
Проще один раз байты посчитать и передвинуть с ЕОФ к началу на заданное число. Чуть с запасом и подать вперед до после \n. Если возможно сразу считать до n\, то всего 2 шага. Теперь можно читать.)
 Зы Или все скопом (2,5 строки) считать и потом в памяти в строки.
 
Evgeniy Zhdan:

У клиента есть индикатор и советник. Индикатор печатает свой файл построчно. Советник печатает тоже какую-то белиберду в свой файл после каждой сделки построчно. Т.е. имеем 2 файла .csv.

Задача: После того как советник открыл сделку и записал свои данные в СВОЙ файл, надо прочитать последние 2 строки из файла индикатора и эти данные снова дописать в файл советника напротив своих данных. Вот так вот. Кому-то бессмысленно, кому-то нет.

Еще вариант для случая файлов сколь угодно большого размера.

Держим в советнике файл, который дописывается индикатором, постоянно открытым на чтение (не на запись) как бинарный. Каждые 16 мс в советнике смотрим, изменилась ли его длина. Если изменилась - значит, что-то добавилось. Считываем добавленное (а это должны быть две последние добавленные строки) в буфер в памяти, начиная со смещения, равного последнему перед добавлением размеру файла, и разбиваем на строки. Какой разделитель, не помню, или два байта 0D 0A (13 10) или один из них. Буфер в памяти - массив байтов размером не меньше двух максимальных длин строк плюс 4.

Текстовый файл, насколько помню, нельзя открыть только на чтение. Если ошибаюсь, проще - держать постоянным открытым файл от индикатора как текстовый, добавленное считывать не в байтовый буфер, а сразу в две строки.
Причина обращения: