Форум трейдеров » Торговые роботы, советники, индикаторы » Вопросы программирования
+ Подписаться
Страница 79 из 87 ПерваяПервая ... 29697778798081 ... ПоследняяПоследняя
  1. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от sydiya Посмотреть сообщение
    .... делаю так....
    Надо использовать FileIsEnding вместо FileIsLineEnding, ты проверяешь конец строки, а не конец файла, а вместо for() лучше использовать while() вдруг файл окажется больше чем указано в for
  2. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от sydiya Посмотреть сообщение
    Кто объяснит?
    :) надо вот это
    Код:
    str=FileReadString(Handle) ;// Читаем все что написано в последней строке
    поставить вместо

    Код:
    FileSeek(Handle,ofset,SEEK_END);
    а то ты читал строку когда указатель уже в конце файла был :D
  3. 2,682
    Комментарии
    28
    Темы
    2807
    Репутация Pro
    Аватар для sydiya  
    Сурововец

    6 Медалей
    Цитата Сообщение от Денис Давыдов Посмотреть сообщение
    :) надо вот это
    Код:
    str=FileReadString(Handle) ;// Читаем все что написано в последней строке
    поставить вместо

    Код:
    FileSeek(Handle,ofset,SEEK_END);
    а то ты читал строку когда указатель уже в конце файла был :D
    Неее! Подожди, ты не прав по моему. Сначала на пальцах попробую.
    Открываем файл. И запускаем цикл, пусть пока for. Цель- на каждой итерации сдвигать файловый указатель на 1 бит, пока он не придет в конец предыдущей строки. Для этого на каждой итерации в цикле отодвигаем на 1 бит дальше от конца файловый указатель в функции FileSeek(Handle,ofset,SEEK_END);
    И ждем пом пока
    if(FileIsLineEnding(Handle))
    break;
    }

    То есть FileIsLineEnding(Handle) сказал нам что он в конце строки, мы через break уходим из цикла и читаем строку с того места где остался файловый указатель -
    str=FileReadString(Handle) ;// Читаем все что написано в последней строке

    Что не так?
    Если сделать как ты предлагаешь, я просто на каждой итерации буду по новой читать последнюю строку с конца, каждый раз с нового места, которое на один бит дальше от конца файла. А зачем?
  4. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от sydiya Посмотреть сообщение
    Что не так?
    Если сделать как ты предлагаешь, я просто на каждой итерации буду по новой читать последнюю строку с конца, каждый раз с нового места, которое на один бит дальше от конца файла. А зачем?
    А только так и получается, придётся читать, а в твоём случае указатель находится в конце строки, затем чтением строки ты читаешь пустое место, т.к. указатель находится в конце строки и чтение начинается с него и до конца текущей строки.
  5. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Хотя твой вариант тоже возможен, если перед чтением строки выполнить
    Код:
    FileSeek(Handle,ofset-1,SEEK_END);
    это для того что бы переместить указатель к началу последней строки.
  6. 2,682
    Комментарии
    28
    Темы
    2807
    Репутация Pro
    Аватар для sydiya  
    Сурововец

    6 Медалей
    Цитата Сообщение от Денис Давыдов Посмотреть сообщение
    А только так и получается, придётся читать, а в твоём случае указатель находится в конце строки, затем чтением строки ты читаешь пустое место, т.к. указатель находится в конце строки и чтение начинается с него и до конца текущей строки.
    Не понимаю. Как же указатель находится к конце строки? Если я напишу вот так -
    FileSeek(Handle,0,SEEK_END);
    То да я его сдвину на 0 байт от конца файла, что то же, что поставить в конец.
    Но ведь я пишу - FileSeek(Handle,ofset,SEEK_END);
    А переменная ofset на каждом цикле увеличивается на 1 и отодвигает файловый указатель на 1 бит от конца файла.
  7. 1,279
    Комментарии
    15
    Темы
    1292
    Репутация Pro
    Аватар для Sevrer  
    Мастер форумных наук

    5 Медалей
    Ну если надо писать в файл инфу по дневной свече (т.е. числовые данные), то я бы поступил так:
    Во первых писал бинарные данные, а не текстовые. Это дает то, что заранее известно сколько байт уходит на запись одного дня. И тогда позиционироваться на последнюю запись не составит труда, эта позиция будет FileSize минус размер одной записи.

    Если нужны именно текстовые данные, опять же, для удобства добавлять текстовые поля пробелами до единого размера, и тогда каждая строка будет иметь одинаковый размер, известный (определенный) заранее, что опять же позволит быстро позиционировать на любую по номеру запись, и тем более последнюю.
  8. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от sydiya Посмотреть сообщение
    Не понимаю. Как же указатель находится к конце строки? Если я напишу вот так -
    FileSeek(Handle,0,SEEK_END);
    То да я его сдвину на 0 байт от конца файла, что то же, что поставить в конец.
    Но ведь я пишу - FileSeek(Handle,ofset,SEEK_END);
    А переменная ofset на каждом цикле увеличивается на 1 и отодвигает файловый указатель на 1 бит от конца файла.
    Да, но ты ведь прерываешь операцию когда FileIsLineEnding является правдой, а это произойдёт, когда указатель достигнет конца строки, т.е. он будет в конце предпоследней строки, т.е. необходимо его на один байт вправо сдвинуть, что и сделает FileSeek(Handle,offset - 1,SEEK_END);
  9. 2,682
    Комментарии
    28
    Темы
    2807
    Репутация Pro
    Аватар для sydiya  
    Сурововец

    6 Медалей
    Цитата Сообщение от Денис Давыдов Посмотреть сообщение
    Хотя твой вариант тоже возможен, если перед чтением строки выполнить
    Код:
    FileSeek(Handle,ofset-1,SEEK_END);
    это для того что бы переместить указатель к началу последней строки.
    Мы не к началу последней строки смещаем, а просто на один байт.

    bool FileSeek( int handle, int offset, int origin)
    Функция перемещает файловый указатель на новую позицию, которая является смещением в байтах от начала, конца или текущей позиции файла. Следующее чтение или запись происходят с новой позиции.


    Если бы int offset было бы строками я бы и не парился.
  10. 4,164
    Комментарии
    7
    Темы
    4265
    Репутация Pro
    Аватар для Денис Давыдов  
    Мастер форумных наук

    4 Медалей
    Цитата Сообщение от sydiya Посмотреть сообщение
    Мы не к началу последней строки смещаем, а просто на один байт.

    bool FileSeek( int handle, int offset, int origin)
    Функция перемещает файловый указатель на новую позицию, которая является смещением в байтах от начала, конца или текущей позиции файла. Следующее чтение или запись происходят с новой позиции.


    Если бы int offset было бы строками я бы и не парился.
    offset задаёт конкретное количество байт которое нужно отступить от нужного края, в твоём случае от конца файла.

Вверх
РегистрацияX

чтобы писать, читать, комментировать